找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 65592|回复: 16

[数值计算] [已解决]批处理中set /a怎么利用移位判断正负?

[复制链接]
发表于 2011-9-6 20:45:47 | 显示全部楼层 |阅读模式

  1. set/a n=a">>"31
  2. ::a>0时,n=0,a<=0时,n=-1
复制代码
set/a 1">>"31
结果为0,是1/(2^31)这样算的是吧,
可是:
set/a -1">>"31
结果是-1,但是-1/2147483648的结果却是0,

就是不明白为什么不是-1?

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2011-9-6 21:36:30 | 显示全部楼层
回复 1# JooKin


    额~批处理可以做除法的咩? -1/2147483648很靠近0,批处理只能取整数部分而已,所以它只显示0咯~
 楼主| 发表于 2011-9-6 22:09:53 | 显示全部楼层
回复 2# garyng

可是-1">>"31的结果为什么会是-1呢?
发表于 2011-9-6 22:32:29 | 显示全部楼层
回复 3# JooKin
  1. ->for /l %a in (-15 1 15)do d2b %a

  2. ->d2b -15
  3. 11111111111111111111111111110001

  4. ->d2b -14
  5. 11111111111111111111111111110010

  6. ->d2b -13
  7. 11111111111111111111111111110011

  8. ->d2b -12
  9. 11111111111111111111111111110100

  10. ->d2b -11
  11. 11111111111111111111111111110101

  12. ->d2b -10
  13. 11111111111111111111111111110110

  14. ->d2b -9
  15. 11111111111111111111111111110111

  16. ->d2b -8
  17. 11111111111111111111111111111000

  18. ->d2b -7
  19. 11111111111111111111111111111001

  20. ->d2b -6
  21. 11111111111111111111111111111010

  22. ->d2b -5
  23. 11111111111111111111111111111011

  24. ->d2b -4
  25. 11111111111111111111111111111100

  26. ->d2b -3
  27. 11111111111111111111111111111101

  28. ->d2b -2
  29. 11111111111111111111111111111110

  30. ->d2b -1
  31. 11111111111111111111111111111111

  32. ->d2b 0
  33. 00000000000000000000000000000000

  34. ->d2b 1
  35. 00000000000000000000000000000001

  36. ->d2b 2
  37. 00000000000000000000000000000010

  38. ->d2b 3
  39. 00000000000000000000000000000011

  40. ->d2b 4
  41. 00000000000000000000000000000100

  42. ->d2b 5
  43. 00000000000000000000000000000101

  44. ->d2b 6
  45. 00000000000000000000000000000110

  46. ->d2b 7
  47. 00000000000000000000000000000111

  48. ->d2b 8
  49. 00000000000000000000000000001000

  50. ->d2b 9
  51. 00000000000000000000000000001001

  52. ->d2b 10
  53. 00000000000000000000000000001010

  54. ->d2b 11
  55. 00000000000000000000000000001011

  56. ->d2b 12
  57. 00000000000000000000000000001100

  58. ->d2b 13
  59. 00000000000000000000000000001101

  60. ->d2b 14
  61. 00000000000000000000000000001110

  62. ->d2b 15
  63. 00000000000000000000000000001111

  64. ->
复制代码
 楼主| 发表于 2011-9-6 23:21:11 | 显示全部楼层
回复 4# plp626


    这个看不太明白,能解释下吗?
还有我记得以前在那本绿皮书上说过,当最高位为1的时候,右移的话,有的编译系统是左补0,有的是左补1,左补0的叫“逻辑移位”,左补1的叫“算术移位”
按这样说的话,CMD是左补0还是1?
发表于 2011-9-6 23:33:04 | 显示全部楼层
本帖最后由 plp626 于 2011-9-6 23:34 编辑

回复 5# JooKin


    cmd的数字是有符号数,按理是算术移位
  1. ->d2b -1

  2. 11111111111111111111111111111111

  3. ->d2b 0

  4. 00000000000000000000000000000000

  5. ->d2b 1

  6. 00000000000000000000000000000001
复制代码
 楼主| 发表于 2011-9-7 01:50:15 | 显示全部楼层
回复 6# plp626


    谢谢,明白了!
比如-9>>31
11111111111111111111111111110111
>>31
------------------------------------------------------
11111111111111111111111111111111
反正只要是负数,右移31位,最低位一定是1,再全部左补1,就是-1了。
 楼主| 发表于 2011-9-7 01:55:54 | 显示全部楼层
可是-1>>31和-1/2147483647不是等价的吗?怎么结果会不一样?
 楼主| 发表于 2011-9-7 14:06:10 | 显示全部楼层
本帖最后由 JooKin 于 2011-9-7 16:26 编辑

没有大侠指点迷津吗?还是因为太简单了
发表于 2011-9-7 23:59:44 | 显示全部楼层
回复 8# JooKin
  1. >> set/a 2147483647
  2. 2147483647
  3. >> set/a 2147483648
  4. -2147483648
  5. >> set/a 2147483649
  6. -2147483647
  7. >> set/a 4294967294
  8. -2
  9. >> set/a 4294967295
  10. -1
  11. >> d2b 2147483647
  12. 01111111111111111111111111111111
  13. >> d2b 2147483648
  14. 10000000000000000000000000000000
  15. >> d2b -2147483648
  16. 10000000000000000000000000000000
  17. >> d2b 2147483649
  18. 10000000000000000000000000000001
  19. >> d2b -2147483647
  20. 10000000000000000000000000000001
  21. >> d2b 4294967294
  22. 11111111111111111111111111111110
  23. >> d2b -2
  24. 11111111111111111111111111111110
  25. >> d2b 4294967295
  26. 11111111111111111111111111111111
  27. >> d2b -1
  28. 11111111111111111111111111111111
  29. >> set/a -1/4294967295
  30. 1
  31. >>
复制代码

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

 楼主| 发表于 2011-9-8 01:15:49 | 显示全部楼层
回复 10# plp626

d2b得出来的是原码吗?

  1. C:\Documents and Settings\Administrator>set/a 4294967294
  2. -2
  3. C:\Documents and Settings\Administrator>set/a 4294967295
  4. 无效数字。数字精确度限为 32 位。

  5. C:\Documents and Settings\Administrator>set/a -1/4294967295
  6. 无效数字。数字精确度限为 32 位。
复制代码
why?
发表于 2011-9-8 11:41:33 | 显示全部楼层
回复 11# JooKin


那先用这个代码理解
  1. set/a -2/4294967294
复制代码
set/a 4294967295是阶段性罢工,原因未明,我这里有时也罢工,你再试试,
 楼主| 发表于 2011-9-8 16:19:43 | 显示全部楼层
回复 12# plp626


    能理解了,
set/a -1/2147483647就是(11111111111111111111111111111111)2÷(01111111111111111111111111111111)2的运算,除了符号位外,原来他们在内部存储的二进制形式都是一样的,所以运算结果就是-1了。
发表于 2011-9-8 23:13:27 | 显示全部楼层
回复 13# JooKin
  1. ->set/a -1/2147483647
  2. 0
复制代码
 楼主| 发表于 2011-9-13 13:45:03 | 显示全部楼层
回复 14# plp626

有点乱|||!请问d2b得出来的是原码还是补码?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 03:08 , Processed in 0.022592 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表