[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] 求助批处理中的一元运算符如何用

这些都不懂:

! ~ -               - 一元运算符
<< >>               - 逻辑移位
&                   - 按位“与”
^                   - 按位“异”
|                   - 按位“或”
&= ^= |= <<= >>=    - 赋值


这些运算符如何使用?

[ 本帖最后由 tireless 于 2009-3-28 22:39 编辑 ]

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 2楼 的帖子

谢谢。看不懂啊...哪里有详细的教学?就好像 1+1=2,1+2=3 这样教的....

TOP

回复 3楼 的帖子

如果先把原码、反码、补码之类的概念搞清楚,可能会有助于理解这些运算。
tireless兄有时间的话,建议找本书《计算机组成原理》来看看。
或者请我们的pusofalse版主出来总结一下他的经验^_^
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

上次跟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 编辑 ]

TOP

! 取非运算符,这个最简单,任何非零的数取非都是0,0取非即是1。
  1. set /a n=!7
  2. set /a m=!0
  3. echo %n% %m%
复制代码
就像只有真假二值的布尔变量。

~取反,可以看下plp626兄的讲解:http://bbs.bathome.net/viewthrea ... mp;highlight=plp626

位运算-按位相与。

先看这些数,只看这些数:
  1. 1 2 4 8 16 32 64 128...
复制代码
请先看出这组数列的规律。

&运算实际应用:比如我们要得到一个窗口的状态,如果用1表示可见,2表示最小化,3表示禁用,4表示处于激活状态,5代表隐藏,6表示最大化。那我们并不能精确计算出这个窗口的状态,因为这个窗口可能同时处于上述的多种状态中,比如处于可见+激活状态中,用1+4表示,结果是5,但5又代表着隐藏状态,岂不是矛盾?~
如果用到上面这组数列就好办多了。可以用1代表可见,2最小化,4禁用,8激活,16隐藏,32最大化。
处于激活+可见状态,可以表示为1+8,结果为9,上面的数列中,单独的一个9并不代表着任何状态~
OK,转换为批处理代码的话,就要用到“按位相与&”:
  1. @echo off
  2. Call :WinGetState 9
  3. Call :WinGetState 10
  4. Call :WinGetState 20
  5. Pause>nul & Exit /b
  6. :WinGetState
  7. Echo %1
  8. set /a m= %1 "&" 1
  9. If %m% equ 1 echo 窗口可见
  10. set /a m=%1 "&" 2
  11. if %m% equ 2 echo 窗口最小化
  12. set /a m= %1 "&" 4
  13. if %m% equ 4 echo 禁用
  14. set /a m= %1 "&" 8
  15. if %m% equ 8 echo 激活
  16. set /a m= %1 "&" 16
  17. If %m% equ 16 echo 隐藏
  18. set /a m= %1 "&" 32
  19. if %m% equ 32 echo 最大化
  20. Echo ================
  21. 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~

关于位运算,只看上面这组数列就行了(斐波那契?)
按位相与就是这样了~
1

评分人数

心绪平和,眼藏静谧。

TOP

返回列表