![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-04 08:29 |
共 48,038 主题排行 / 350,123 发帖 / 今日 0 篇 / 48,251 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [已结]set /a 中的表达式中&和|符号到底是怎么回事? |
| 可打印版本 1,884 / 15 |
| 第1楼 26933062 | 发表于 2008-04-19 13:08 |
| 银牌会员 发帖 879 积分 2,268 | |
|
[已结]set /a 中的表达式中&和|符号到底是怎么回事? set /a 中的表达式
下例中 & 和 | 符号到底是怎么回事? 帮助信息实在是看不懂 为何 leap 的值会是 1 ,谁能讲解一下它的执行过程到底是怎样的? 谢谢!!! : [ Last edited by HAT on 2009-1-3 at 21:07 ] |
|
| 第2楼 slore | 发表于 2008-04-19 13:12 |
| 铂金会员 发帖 2,478 积分 5,212 | |
|
与和或的运算……
X 或 真 肯定是 真。。。 |
|
| 第3楼 lxmxn | 发表于 2008-04-19 13:12 |
| 版主 发帖 4,938 积分 11,386 | |
|
& 按位与运算;
| 按位或运算; 0 & 0 --> 0 0 | 1 --> 1 结果自然是1。 |
|
| 第4楼 26933062 | 发表于 2008-04-19 13:17 |
| 银牌会员 发帖 879 积分 2,268 | |
|
就是这句 & 按位与运算 搞不懂是什么意识?
版主能再详细讲解下么?或者多举几个实例? 劳烦了!! |
|
| 第5楼 dikex | 发表于 2008-04-19 13:25 |
| 高级用户 发帖 366 积分 788 | |
|
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) |
|
| 第6楼 26933062 | 发表于 2008-04-19 13:41 |
| 银牌会员 发帖 879 积分 2,268 | |
|
越看越糊涂了。。。。
对应位相与 位 是什么意识? 相 是什么意识? 与 是什么意识? |
|
| 第7楼 plp626 | 发表于 2008-04-19 13:53 |
| 银牌会员 发帖 1,020 积分 2,278 | |
|
对于/a 参数
/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式 注意前提: 1. 8进制数0?(0<=?<=7)与16进制数0x?(0<=?<=15),首字符不为0者为10进制数. 2. /a参数只对-(2^31-1)至2^31之间整数进行操作(注意是xp版本). 这点可以用代码来测试: 一元运算符~ ! - ~取反 将-(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 ... ~就表示的反数 比如: %a%就等于0 %a%就等于-6 !取非 !为0 !为1 比如: %a%就等于0 %a%就等于1 "-"取负数 -与数学上的-x是一致的,只是要注意发生溢出时的状况 比如: %a%为-2147483648而非2147483648,这是因为2147483648已溢出: 2147483648=(2^31-1)+1 算术运算符 * / % ﹢ - 算术运算符: * / % ﹢ - 分别对应 数学符号: x ÷ mod(取余) + - 需要注意的是"%"是在命令行下,而在bat中则要用%% 逻辑移位: << >> 注意在批处理中或命令行下要加上一对双引号""或用^对<,>进行转义. set /a "<<" 表示对的二进制数左移位 比如: %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 经过简单的数学推导就可以知道: "<<"==*2^ ">>"==/2^(注意溢出) 同理">>"就是右移,原理一样,这里略. 逻辑 "异", "或", "与": "^", "|", "&" 注意在批处理中或命令行下要在运算符前加上^ 这里的: ^ | & 对应于 离散数学上的: 异或⊕ 析取∨ 合取∧ 规则: 合取∧(有0则0) 析取∨ (有1则1) 异或⊕ (同0反1) 比如: %a%就等于10 这是因为: 01111 ⊕) 00101 ───── =) 01010 而bin(01010)=10 对于"|", "&"原理一样,这里略. 赋值运算符 "=" 这个不用说了 对于 *= /= %= += -= &= ^= |= <<= >> 拿"+="为例,其他同理. 这只是一种简写 比如下面两行代码等效: 表达式分隔符"," 这个运算符可以用来简化代码: 比如: 就可以简写为: 另外: set /a ... 与 set /p ... 可以省略掉set 与 /之间的空格写成 set/a ... 与 set/p ... 关于这类省略空格的用法,还有不少,后续再补充. set/a的另一个用法: ........ 更详细的请点击我下面的"学习" | | [ Last edited by plp626 on 2008-4-19 at 02:31 PM ] |
|
| 第8楼 huahua0919 | 发表于 2008-04-19 13:53 |
| 银牌会员 发帖 780 积分 1,608 | |
|
(位)一个字节有八位用二进制数0,1表示
(与)的意思大致就是乘意思 按位与就是一一对应: 1*1=1 1*0=0 0*1=0 0*0=0 |
|
| 第9楼 plp626 | 发表于 2008-04-19 14:12 |
| 银牌会员 发帖 1,020 积分 2,278 | |
|
逻辑 "异", "或", "与": "^", "|", "&"
注意在批处理中或命令行下要在运算符前加上^ 这里的: ^ | & 对应于 离散数学上的: 异或⊕ 析取∨ 合取∧ 规则: 合取∧(有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 |
|
| 第10楼 26933062 | 发表于 2008-04-19 14:33 |
| 银牌会员 发帖 879 积分 2,268 | |
|
非常感谢各位的热心解答。
我确实不是学计算机的,数学就更不是了,我只是初中文凭。 对电脑也只懂一点bat,完全是兴趣,其它的一概不知。 看了 plp626 兄的这一句:吸取---有1则1,无1则0 是否可以这样理解: set /a w="(n|m)" 此句中,n或m 只要有一个是1,那么结果就是1,否则结果就是0 ? n和m的位数必须是一样多的么? |
|
| 第11楼 plp626 | 发表于 2008-04-19 16:51 |
| 银牌会员 发帖 1,020 积分 2,278 | |
|
不对,看来你底子很薄。
你先把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 |
|
| 第12楼 26933062 | 发表于 2008-04-20 01:16 |
| 银牌会员 发帖 879 积分 2,268 | |
|
多谢plp626兄弟的详细讲解,似乎有点明白了。
set /a w="(n|m)" 首先把n和m转成2进制数,再补0使它们位数相同。 然后: 关键是这里了, 有1则1,无1则0 是指把这两个数的个位和各位对比,十位和十位对比,百位和百位对比。。。。 有1则结果为 1 无1则结果为 0 是这样么? 再次感谢兄弟的帮助! |
|
| 第13楼 plp626 | 发表于 2008-04-20 01:42 |
| 银牌会员 发帖 1,020 积分 2,278 | |
|
是的,对应位上有1则1,无1则0,
最后转换为10进制数 其实你实践几个命令就行了,也不必记,不用就忘了。我也是当时总结时写的。 |
|
| 第14楼 26933062 | 发表于 2008-04-20 02:01 |
| 银牌会员 发帖 879 积分 2,268 | |
|
烦劳再说说 & 的意识。
5楼的讲解; set /a aa="100&120" 100(D) = 1100100(B) 120(D) = 1111000(B) "100&120" (对应位相与) ==> 1100100 1111000 ------------ 1100000(B) = 96(D) 想问的是 最后这个 1100000 是怎么来的?是 8 楼所说的 “乘” 的结果吗? 对应位相与 不明白什么意识? |
|
| 第15楼 plp626 | 发表于 2008-04-20 02:26 |
| 银牌会员 发帖 1,020 积分 2,278 | |
|
我都忘了,&这个是与:
逻辑”与“--& 就是对应位上合取,(有0则0,无0则1,可以理解为0*0=0,0*1=1) 最好自己实践下, set/a "?&?" 看结果! [ Last edited by plp626 on 2008-4-20 at 02:39 AM ] |
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |