! 取非运算符,这个最简单,任何非零的数取非都是0,0取非即是1。- set /a n=!7
- set /a m=!0
- echo %n% %m%
复制代码 就像只有真假二值的布尔变量。
~取反,可以看下plp626兄的讲解:http://bbs.bathome.net/viewthrea ... mp;highlight=plp626
位运算-按位相与。
先看这些数,只看这些数:复制代码 请先看出这组数列的规律。
&运算实际应用:比如我们要得到一个窗口的状态,如果用1表示可见,2表示最小化,3表示禁用,4表示处于激活状态,5代表隐藏,6表示最大化。那我们并不能精确计算出这个窗口的状态,因为这个窗口可能同时处于上述的多种状态中,比如处于可见+激活状态中,用1+4表示,结果是5,但5又代表着隐藏状态,岂不是矛盾?~
如果用到上面这组数列就好办多了。可以用1代表可见,2最小化,4禁用,8激活,16隐藏,32最大化。
处于激活+可见状态,可以表示为1+8,结果为9,上面的数列中,单独的一个9并不代表着任何状态~
OK,转换为批处理代码的话,就要用到“按位相与&”:- @echo off
- Call :WinGetState 9
- Call :WinGetState 10
- Call :WinGetState 20
- Pause>nul & Exit /b
-
- :WinGetState
- Echo %1
- set /a m= %1 "&" 1
- If %m% equ 1 echo 窗口可见
- set /a m=%1 "&" 2
- if %m% equ 2 echo 窗口最小化
- set /a m= %1 "&" 4
- if %m% equ 4 echo 禁用
- set /a m= %1 "&" 8
- if %m% equ 8 echo 激活
- set /a m= %1 "&" 16
- If %m% equ 16 echo 隐藏
- set /a m= %1 "&" 32
- if %m% equ 32 echo 最大化
- Echo ================
- Pause
复制代码 关于&,只须分解出&两边的数值是上述数列中哪些因素的和就可以了。
set /a n=77"&"23
分解:
77=1+4+8+64
23=1+2+4+16
分解出了是哪些数的和就好办多了,可以看出分解出的数中都有1和4,那就1和4相加,所以77"&"23的结果就是1+4=5。
再来,set /a n=34"&"100
34=2+32
100=4+32+64
还是找其中一样的,所以34"&"100的结果就是32~
set /a n=1"&"8
1=1+0
8=8+0
结果是0~
关于位运算,只看上面这组数列就行了(斐波那契?)
按位相与就是这样了~ |