我正在自学Java,并完成了用java思考的练习。
在第116页的练习11中,你应该右移一个整数的所有二进制位置,并用Integer.toBinaryString显示每个位置。
public static void main(String[] args) {
int i = 8;
System.out.println(Integer.toBinaryString(i));
int maxIterations = Integer.toBinaryString(i).length();
int j;
for (j = 1; j < maxIterations; j++) {
i >>= 1;
System.out.println(Integer.toBinaryString(i));
}在解决方案指南中,输出如下所示:
1000
1100
1110
1111当我运行这段代码时,我得到了这样的结果:
1000
100
10
1这是怎么回事。数字被截断了吗?
我使用的是64位jdk1.6.0_20。这本书使用的是jdk1.5 32位。
发布于 2010-06-10 00:38:10
看来这本书里有个错误。
右移位操作将所有位向右移位,删除最低有效位。如果您将结果正确对齐(例如,通过用零填充),这会更有意义。
00001000
00000100
00000010
00000001
00000000移入的最高位是:
如果你的数字是正数,
如果您希望最终结果为1,则尝试使用负数,如-8而不是8。
11111111111111111111111111111000
11111111111111111111111111111100
11111111111111111111111111111110
11111111111111111111111111111111如果使用>>>而不是>>,则无论数字是正数还是负数,都将始终移入零。
发布于 2010-06-10 00:39:05
当给定一个正整数作为输入时,右移位操作符最终会产生一个零,这是正确的。
最好将其视为这样一种操作,即所有数字都向右移位,最右侧的数字被截断,并在左侧添加额外的零,即模式为:
00001000
00000100
00000010
00000001
00000000
00000000发布于 2010-06-10 00:40:23
来自按位运算符Java Tutorials Page
无符号右移位操作符">>>“将一个零移到最左边的位置,而">>”之后的最左边的位置取决于符号扩展。
因为8是正的,所以零被移位了。如果i为负,则会将1移位(以保持整数上的符号不变)。
https://stackoverflow.com/questions/3007860
复制相似问题