黑马程序员技术交流社区

标题: 关于位运算>>符号的问题 [打印本页]

作者: 杜天伟    时间: 2013-7-6 16:52
标题: 关于位运算>>符号的问题
本帖最后由 巩建 于 2013-7-6 18:15 编辑

刚刚看毕老师视频第二天位运算关于>>右移符号,毕老师总结的规律:其实就是除以2的移动位数次幂.但是我试了一下负数比如-6>>2得到的却是-2而不是-1.而按照毕老师总结的规律算的话结果就是-1.这是怎么回事?还是说毕老师的规律不适用于负数?
作者: 杜天伟    时间: 2013-7-6 16:53
手机码字有点乱
作者: 宋智超    时间: 2013-7-6 17:28
负数是以补码的形式存的,移的是负数的补码。
作者: denghui1010    时间: 2013-7-6 17:37
本帖最后由 denghui1010 于 2013-7-6 17:38 编辑

有符号的位移操作
11111111 11111111 11111111 11111010     -6在计算机中的表示
11111111 11111111 11111111 11111110     右移两位,结果为负数
这个值是多少呢,看看它对应的正数是多少,再加上负号就是了,于是进行先减1再求反操作(逆向)
1111111111 11111111 11111111 111101      减1之后
0000000000 00000000 00000000 000010      取反=2
所以值=-2


作者: 杜天伟    时间: 2013-7-6 17:40
denghui1010 发表于 2013-7-6 17:37  有符号的位移操作  11111111 11111111 11111111 11111010 -6在计算机中的表示  11111111 11111111 111111 ...

这个我明白,我想问的是毕老师总结的这个运算规律是不是对负数不适用呢?还是怎么回事
作者: 郑才熹    时间: 2013-7-6 17:41
如果对负数进行>>右移时,当能够被2的幂整除时是满足毕老师的规律的。负数右移时要注意,符号位的1不参与移位;在移位中当移出的数字是1时,则最后结果应加1;当移出去的数字是0时,则最后结果不加1。所以,-6>>2的结果是-2,而不是-1.
作者: denghui1010    时间: 2013-7-6 17:45
杜天伟 发表于 2013-7-6 17:40
这个我明白,我想问的是毕老师总结的这个运算规律是不是对负数不适用呢?还是怎么回事 ...

整除的时候可以,不整除的时候不可以
作者: 杜天伟    时间: 2013-7-6 17:57
所以正数右移除以2除不尽小数舍去,负数除不尽要进1喽?
作者: denghui1010    时间: 2013-7-6 18:18
杜天伟 发表于 2013-7-6 17:57
所以正数右移除以2除不尽小数舍去,负数除不尽要进1喽?

对,就是取小于结果并最接近结果的那个整数
作者: 草帽    时间: 2013-7-6 18:43
十进制负数转换成二进制时,首先将负数转换为对应的原码(去 - 号后的整数转化为二进制),然后将原码的每一位做取反操作得到反码。(取反操作:0变为1,1变为0),最后将反码+1得到补码就是所求的二进制。当然这里我们都是以有二进制符号数计算的。
二进制(符号位为1)转换为十进制则由上面的方法反过来就好。
楼主的-6二进制右移2位为  11111111 11111111 1111111 11111010 >> 2  为  11111111 11111111 11111111 11111110  由于符号位为(-)依上边十进制转二进制的方法反过来转换正好是 -2。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2