中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-12 18:43
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [分享]位运算演示 查看 1,039 回复 2
楼 主 [分享]位运算演示 发表于 2009-10-12 00:51 ·  中国 北京 阿里云BGP服务器
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
找不见了,重新发...

以前自己写的一个位运算演示的代码(函数的调用改为netbenton的方法),现拿出来和大家分享一下,希望能让初学者对位运算有更深刻的认识...
@echo off
title 位运算示例 code by:cn-dos-moniuming
echo.
echo.位运算名词解释(个人理解):
echo.
echo.位运算: 按操作数在计算机内表示的二进制数逐位进行逻辑运算或移位运算.
echo.与(^&): 全部都是1才为1(指返回值,下同),否则为0.
echo.或(^|): 只要有1则为1,否则为0.
echo.异或(^^): 不同为1,相同为0.
echo.取反(~): 是1则0,是0则1(单目运算符).
echo.取负(-): 先取反再加1(单目运算符).
echo.左移n位(^<^<n): 相当于乘以2的n次方(用0补位).
echo.右移n位(^>^>n): 相当于除以2的n次方(负数用1补位,正数用0补位).
echo.
echo.下面的示例是在三十二位系统(数值范围:-2147483648~2147483647)下运行的结果.
echo.请输入批处理能处理的数值(整数),否则将不能正确处理.如发生溢出,结果也不会正确.
echo.
rem 将十进制转换为二进制的函数.
set "fun_d2b=setlocal enabledelayedexpansion&(for /l %%a in (0 1 31) do (set /a "str=!#a#!^>^>%%a"&set /a "str^&=1"&set "str_d2b=!str!!str_d2b!"))&(for %%a in (!str_d2b!) do (endlocal&set #a#=%%a))"
setlocal enabledelayedexpansion
:agn
set in=&set /p in=请输入两个数(中间用空格隔开,回车退出):
if not defined in exit
set n=0
for %%a in (%in%) do (
set /a n+=1
set /a num!n!=%%a 2>nul
)
cls
echo.输入的两个数的有效数值为: "!num1!" 和 "!num2!", 用二进制表示分别为:
set /a str1=num1,str2=num2
%fun_d2b:#a#=str1%
%fun_d2b:#a#=str2%
echo.&echo.!str1! ==^> !num1!
echo.!str2! ==^> !num2!
echo.&echo.各种位运算的结果如下:
set /a "num=!num1!&!num2!,t=num"
%fun_d2b:#a#=num%&echo.&echo.!num! ==^> 按位与: !num1! ^& !num2! = !t!
set /a "num=!num1!|!num2!,t=num"
%fun_d2b:#a#=num%&echo.&echo.!num! ==^> 按位或: !num1! ^| !num2! = !t!
set /a "num=!num1!^^!num2!,t=num"
%fun_d2b:#a#=num%&echo.&echo.!num! ==^> 按位异或: !num1! ^^^^ !num2! = !t!
set /a "num=~!num1!,t=num"
%fun_d2b:#a#=num%&echo.&echo.!num! ==^> 按位取反: ~(!num1!) = !t!
set /a "num=-!num1!,t=num"
%fun_d2b:#a#=num%&echo.&echo.!num! ==^> 取负: -(!num1!) = !t!
set /a "ran=%random%%%5+2,num=!num1!,num<<=ran,t=num"
%fun_d2b:#a#=num%&echo.&echo.!num! ==^> 左移!ran!位: !num1! ^<^< !ran! = !t!
set /a "ran=%random%%%5+2,num=!num1!,num>>=ran,t=num"
%fun_d2b:#a#=num%&echo.&echo.!num! ==^> 右移!ran!位: !num1! ^>^> !ran! = !t!
echo.&goto :agn
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
plp626 +15 2009-10-12 18:19
2 发表于 2009-10-12 18:19 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
不说了,直接加分,我刚来论坛时,若有这样的帖子一定少走不少弯路
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
3 发表于 2009-11-16 11:01 ·  中国 浙江 温州 瑞安市 电信
新手上路
积分 3
发帖 2
注册 2009-11-11 14:52
16年会员
UID 154563
性别 男
状态 离线
好帖,谢谢楼主热情分享。
收藏慢慢研究
论坛跳转: