标题: [数值计算] 求助批处理中的一元运算符如何用 [打印本页]
作者: tireless 时间: 2009-3-28 22:37 标题: 求助批处理中的一元运算符如何用
这些都不懂:
! ~ - - 一元运算符
<< >> - 逻辑移位
& - 按位“与”
^ - 按位“异”
| - 按位“或”
&= ^= |= <<= >>= - 赋值
这些运算符如何使用?
[ 本帖最后由 tireless 于 2009-3-28 22:39 编辑 ]
作者: Batcher 时间: 2009-3-28 22:43
批处理位运算
http://bbs.bathome.net/thread-1844-1-1.html
作者: tireless 时间: 2009-3-28 23:14 标题: 回复 2楼 的帖子
谢谢。看不懂啊...哪里有详细的教学?就好像 1+1=2,1+2=3 这样教的....
作者: Batcher 时间: 2009-3-28 23:51 标题: 回复 3楼 的帖子
如果先把原码、反码、补码之类的概念搞清楚,可能会有助于理解这些运算。
tireless兄有时间的话,建议找本书《计算机组成原理》来看看。
或者请我们的pusofalse版主出来总结一下他的经验^_^
作者: 523066680 时间: 2009-3-29 07:58
上次跟pusofalse讨论了一下 "<<"
set /a n=2 "<<" 1
4
set /a n=2 "<<" 2
8
以下叙述是在书上看到的模糊的记忆,仅供参考哈。
n "<<" m 的意思是 将数字n的二进制形式向左移m位,
后面补上m个0 . 如1 变成100 换回十进制 就是4
n "<<" m = n * (2 ^ m)
n ">>" m 的意思是 将数字n的二进制形式向右移m位,后m位去掉
如果是正数 则前面补0 如果是负数 则前面补1 (好像是,错了还请指出)
但最终结果 = n / (2 ^ m)
[ 本帖最后由 523066680 于 2009-3-29 08:13 编辑 ]
作者: pusofalse 时间: 2009-3-29 18:33
! 取非运算符,这个最简单,任何非零的数取非都是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~
关于位运算,只看上面这组数列就行了(斐波那契?)
按位相与就是这样了~
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |