中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]set /a 中的表达式中&和|符号到底是怎么回事?
<<   [1] [2]  >>   >
作者:
标题: [已结]set /a 中的表达式中&和|符号到底是怎么回事? 上一主题 | 下一主题
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『楼 主』:  [已结]set /a 中的表达式中&和|符号到底是怎么回事?

set /a 中的表达式 下例中 & 和 | 符号到底是怎么回事? 帮助信息实在是看不懂 为何 leap 的值会是 1 ,谁能讲解一下它的执行过程到底是怎样的? 谢谢!!! :
@echo off
set /a leap="(0&0|1)"
echo %leap%
pause
[ Last edited by HAT on 2009-1-3 at 21:07 ]




致精致简!
2008-4-19 13:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 2 楼』:  

与和或的运算…… X 或 真 肯定是 真。。。


2008-4-19 13:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 3 楼』:  

& 按位与运算; | 按位或运算; 0 & 0 --> 0 0 | 1 --> 1 结果自然是1。


2008-4-19 13:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 4 楼』:  

就是这句 & 按位与运算 搞不懂是什么意识? 版主能再详细讲解下么?或者多举几个实例? 劳烦了!!




致精致简!
2008-4-19 13:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 5 楼』:  

set /a aa="100&120" 100(D) = 1100100(B) 120(D) = 1111000(B) "100&120" (对应位相与) ==> 1100100 1111000 ------------ 1100000(B) = 96(D) 同理: "100|120" (对应位相或) ==> 1100100 1111000 ------------ 1111100(B) = 124(D)


   此帖被 +5 点积分      点击查看详情   
评分人:【 26933062 分数: +5  时间:2008-4-20 01:40




正在潜水修练的批处理小白
2008-4-19 13:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 6 楼』:  

越看越糊涂了。。。。 对应位相与 位 是什么意识? 相 是什么意识? 与 是什么意识?




致精致简!
2008-4-19 13:41
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 7 楼』:  

对于/a 参数
/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式 评估器很简单并以递减的优先权顺序支持下列操作: () - 分组 ! ~ - - 一元运算符 * / % - 算数运算符 + - - 算数运算符 << >> - 逻辑移位 & - 按位“与” ^ - 按位“异” | - 按位“或” = *= /= %= += -= - 赋值 &= ^= |= <<= >>= , - 表达式分隔符
注意前提: 1. 8进制数0?(0<=?<=7)与16进制数0x?(0<=?<=15),首字符不为0者为10进制数. 2. /a参数只对-(2^31-1)至2^31之间整数进行操作(注意是xp版本). 这点可以用代码来测试:
@echo off&setlocal enabledelayedexpansion
:支持最大数为1.9950631168807583848837421626836e+3010
set m=1
for /l %%a in (1 1 10000) do (
   for /l %%b in (1 1 %%a) do (
      set /a m*=2
      set /a n+=1
      echo !m!=2^^^^!n!
      if "!m:~,1!" == "-" echo !m!&set /a mm=!m!-1&echo !mm!=!m!-1 &pause&exit
)  )
一元运算符~ ! - ~取反 将-(2^31-1)至2^31看做一个数轴,"原点O"为0的左侧与-1的右侧 (此数轴可以看做一个首尾封闭的数轴,对2^31-1加1将得到-2^31) 这样可以将计算机里的二进制数(全是整数)的取反看做求"相反数"了: -2^31 ...︺︺︺︺︺︺︺︺︺︺︺︺︺︺︺O︺︺︺︺︺︺︺︺︺︺︺︺︺︺︺... 2^31-1 ... -3 -2 -1 0 1 2 3 ... ~[x]就表示[x]的反数 比如:
 set /a a=~-1
%a%就等于0
set /a a=~5
%a%就等于-6 !取非 ![非0正数]为0 ![0]为1 比如:
set /a a=!2
%a%就等于0
set /a a=!0
%a%就等于1 "-"取负数 -[x]与数学上的-x是一致的,只是要注意发生溢出时的状况 比如:
 set /a a=-(-2147483648)
%a%为-2147483648而非2147483648,这是因为2147483648已溢出: 2147483648=(2^31-1)+1 算术运算符 * / % ﹢ - 算术运算符: * / % ﹢ - 分别对应 数学符号: x ÷ mod(取余) + - 需要注意的是"%"是在命令行下,而在bat中则要用%% 逻辑移位: << >> 注意在批处理中或命令行下要加上一对双引号""或用^对<,>进行转义. set /a [x]"<<"[y] 表示对[x]的二进制数左移[y]位 比如:
set /a a=15"<<"1
%a%就等于30 这是因为:15=bin(00 00000 00000 00000 00000 00000 01111) 左移1位就成了bin(0 00000 00000 00000 00000 00000 011110) 而bin(0 00000 00000 00000 00000 00000 011110)=2^4+2^3+2^2+2^1=30 经过简单的数学推导就可以知道: [x]"<<"[y]==[x]*2^[y] [x]">>"[y]==[x]/2^[y](注意溢出) 同理">>"就是右移,原理一样,这里略. 逻辑 "异", "或", "与": "^", "|", "&" 注意在批处理中或命令行下要在运算符前加上^ 这里的: ^ | & 对应于 离散数学上的: 异或⊕ 析取∨ 合取∧ 规则: 合取∧(有0则0) 析取∨ (有1则1) 异或⊕ (同0反1) 比如:
set /a a=15^^5
%a%就等于10 这是因为: 01111 ⊕) 00101 ───── =) 01010 而bin(01010)=10 对于"|", "&"原理一样,这里略. 赋值运算符 "=" 这个不用说了 对于 *= /= %= += -= &= ^= |= <<= >> 拿"+="为例,其他同理. 这只是一种简写 比如下面两行代码等效:
set /a a+=2
set /a a=a+2
表达式分隔符"," 这个运算符可以用来简化代码: 比如:
set /a a=1
set /a b=2
set /a c+=3
就可以简写为:
set /a a=1,b=2,c+=3
另外: set /a ... 与 set /p ... 可以省略掉set 与 /之间的空格写成 set/a ... 与 set/p ... 关于这类省略空格的用法,还有不少,后续再补充. set/a的另一个用法: ........ 更详细的请点击我下面的"学习" | | [ Last edited by plp626 on 2008-4-19 at 02:31 PM ]


   此帖被 +5 点积分      点击查看详情   
评分人:【 26933062 分数: +5  时间:2008-4-20 01:40




山外有山,人外有人;低调做人,努力做事。 进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-19 13:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 8 楼』:  

(位)一个字节有八位用二进制数0,1表示 (与)的意思大致就是乘意思 按位与就是一一对应: 1*1=1 1*0=0 0*1=0 0*0=0


2008-4-19 13:53
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 9 楼』:  

逻辑 "异", "或", "与": "^", "|", "&" 注意在批处理中或命令行下要在运算符前加上^ 这里的: ^ | & 对应于 离散数学上的: 异或⊕ 析取∨ 合取∧ 规则: 合取∧(有0则0) 析取∨ (有1则1) 异或⊕ (同0反1) 看来楼主和不是学计算机的,也不是数学专业的, 我这里解释下规则: 合取∧(有0则0) 析取∨ (有1则1) 异或⊕ (同0反1) 只说逻辑或|(吸取),其他类似 逻辑或是按位(转换为2进制数)吸取---有1则1,无1则0 比如12的二进制数为1100 6的二进制数110 现在对他们做逻辑或|(吸取运算:有1则1,无1则0) 首先对齐位数,不够的前面补0 1100 0110 ------- 1110


   此帖被 +5 点积分      点击查看详情   
评分人:【 26933062 分数: +5  时间:2008-4-20 01:41




山外有山,人外有人;低调做人,努力做事。 进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-19 14:12
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 10 楼』:  

非常感谢各位的热心解答。 我确实不是学计算机的,数学就更不是了,我只是初中文凭。 对电脑也只懂一点bat,完全是兴趣,其它的一概不知。 看了 plp626 兄的这一句:吸取---有1则1,无1则0 是否可以这样理解: set /a w="(n|m)" 此句中,n或m 只要有一个是1,那么结果就是1,否则结果就是0 ? n和m的位数必须是一样多的么?




致精致简!
2008-4-19 14:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 11 楼』:  

不对,看来你底子很薄。 你先把n,m转化为二进制数,这个不用我多说了吧, 有1则1,无1则0是对应位上 的运算.两个数位数不等时,少的前补0, 6的2进制数为110是一个3位二进制数, 12的二进制数为1100是一个4位二进制数, 怎么办,其实110就是0110,也是00110,因为这些数转化为10进制数都是6, 所以6|12--->0110∨1100=1110 0 1 1 0 1 1 0 0 ------------∨(对应位上有1则1,无1则0) 1 1 1 0 这个1110是个2进制数,计算机得转化为十进制数告诉你 1110转为进制数为就是14,所以: set/a w="6|12" w就是14


   此帖被 +5 点积分      点击查看详情   
评分人:【 26933062 分数: +5  时间:2008-4-20 01:40




山外有山,人外有人;低调做人,努力做事。 进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-19 16:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 12 楼』:  

多谢plp626兄弟的详细讲解,似乎有点明白了。 set /a w="(n|m)" 首先把n和m转成2进制数,再补0使它们位数相同。 然后: 关键是这里了, 有1则1,无1则0 是指把这两个数的个位和各位对比,十位和十位对比,百位和百位对比。。。。 有1则结果为 1 无1则结果为 0 是这样么? 再次感谢兄弟的帮助!




致精致简!
2008-4-20 01:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 13 楼』:  

是的,对应位上有1则1,无1则0, 最后转换为10进制数 其实你实践几个命令就行了,也不必记,不用就忘了。我也是当时总结时写的。




山外有山,人外有人;低调做人,努力做事。 进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-20 01:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 14 楼』:  

烦劳再说说 & 的意识。 5楼的讲解; set /a aa="100&120" 100(D) = 1100100(B) 120(D) = 1111000(B) "100&120" (对应位相与) ==> 1100100 1111000 ------------ 1100000(B) = 96(D) 想问的是 最后这个 1100000 是怎么来的?是 8 楼所说的 “乘” 的结果吗? 对应位相与 不明白什么意识?




致精致简!
2008-4-20 02:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 15 楼』:  

我都忘了,&这个是与: 逻辑”与“--& 就是对应位上合取,(有0则0,无0则1,可以理解为0*0=0,0*1=1) 最好自己实践下, set/a "?&?" 看结果! [ Last edited by plp626 on 2008-4-20 at 02:39 AM ]




山外有山,人外有人;低调做人,努力做事。 进入网盘(各种工具)~~ 空间~~cmd学习
2008-4-20 02:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
<<   [1] [2]  >>   >
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: