中国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 参数

  Quote:
/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] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: