|
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)
|
正在潜水修练的批处理小白 |
|
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 ]
|
山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具)~~ 空间~~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
|
山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具)~~ 空间~~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
|
山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具)~~ 空间~~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 |
|