黑马程序员技术交流社区

标题: 负数怎么实现逻辑右移? [打印本页]

作者: 箫庐    时间: 2011-12-2 18:19
标题: 负数怎么实现逻辑右移?
本帖最后由 箫庐 于 2011-12-5 13:18 编辑

比如 -8>>>2 ?

运行以下程序
               System.out.println("-8>>>2="+Integer.toBinaryString(-8>>>2));
                System.out.println("-8>>>2="+(-8>>>2));
得的结果是:
[attach]331[/attach]

再打印
             System.out.println(Integer.toBinaryString(-2));
得的结果为上面的二进制表示的数。



什么原理啊?

无标题.png (898 Bytes, 下载次数: 170)

无标题.png

作者: 赵燕燕    时间: 2011-12-3 02:13
-8>>>2后前面补得是两个0,即 0011 1111 1111 1111 1111 1111 1111 1110,转换为整数为1073741822
System.out.println("-8>>>2="+Integer.toBinaryString(-8>>>2));是将右移后的数转换成二进制数表示的字符串,再打印这个字符串
System.out.println(Integer.toBinaryString(-2));是一样的
System.out.println("-8>>>2="+(-8>>>2));就是打印计算结果1073741822
作者: wsssx    时间: 2011-12-3 09:39
提示: 作者被禁止或删除 内容自动屏蔽
作者: 杨强    时间: 2011-12-3 11:46
在能整除的情况下 被移数/2^移动位数次幂=移动后的数
不能整除的情况下 我自己的结论是 向上取整 比如是-2.1就是-3
作者: 箫庐    时间: 2011-12-3 12:42
赵燕燕 发表于 2011-12-3 02:13
-8>>>2后前面补得是两个0,即 0011 1111 1111 1111 1111 1111 1111 1110,转换为整数为1073741822
System. ...

那就是说-8>>>2的结果是1073741822而不是-2吗?
作者: 武超    时间: 2011-12-3 15:18
这是十进制转化成了二进制,  取反加一,就得到了-2这个结果了。好像是机器数转化成真值吧?有点忘记了
作者: 赵燕燕    时间: 2011-12-3 20:20
箫庐 发表于 2011-12-3 12:42
那就是说-8>>>2的结果是1073741822而不是-2吗?

是的。-8>>2才等于-2
作者: 箫庐    时间: 2011-12-5 08:44
赵燕燕 发表于 2011-12-3 20:20
是的。-8>>2才等于-2

嗯.基本上明白了.

感觉是在控制台里面显示二进制的时候,前面的0都省略了导致这样的困惑.
不知道我的说法有没有问题.
谢谢大家热心解答~:)




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