我正在教自己java和我在Thinking in 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 32bit。
答案 0 :(得分:9)
看起来书中有错误。
右移操作将所有位向右移位,移除最低有效位。如果您正确对齐结果(例如,通过用零填充),这会更有意义。
00001000
00000100
00000010
00000001
00000000
移入的最高位是:
如果您希望最终结果为1,请尝试使用负数 - 如-8而不是8。
11111111111111111111111111111000
11111111111111111111111111111100
11111111111111111111111111111110
11111111111111111111111111111111
如果您使用>>>
代替>>
,则无论数字是正数还是负数,都会始终移入零。
答案 1 :(得分:3)
当给出正整数作为输入时,右移位运算符最终产生零是正确的。
最好将其视为一个操作,其中所有数字都向右移动,最右边的数字被截断,并且左边增加了一个零,即模式为:
00001000
00000100
00000010
00000001
00000000
00000000
答案 2 :(得分:3)
来自按位运算符Java Tutorials Page:
无符号右移运算符 “&GT;&GT;&gt;” 中将零移到最左边 位置,而最左边的位置 在“&gt;&gt;”之后取决于符号扩展。
由于8为正,因此移位为零。如果i
为负数,则会改变一个(以便在整数上保持相同的符号)。
答案 3 :(得分:2)
右移位运算符将位移到右侧,即
01000
00100
00010
00001
右移将“填充”最左边的位,其值与移位前的值相同。 由于最左边的位是符号,正值将用零填充,负值用1填充。
答案 4 :(得分:1)
如果你在int中设置最高位
int i = 1 << 31;
您将看到所描述的行为,在换班期间将保留该标志。 我认为这是一个用来说明操作的例子。
10000000000000000000000000000000
11000000000000000000000000000000
11100000000000000000000000000000
11110000000000000000000000000000
11111000000000000000000000000000
11111100000000000000000000000000
11111110000000000000000000000000
....
11111111111111111111111111111000
11111111111111111111111111111100
11111111111111111111111111111110
11111111111111111111111111111111
答案 5 :(得分:1)
您似乎认为variable >>= 1
将一个转移到变量上。 1
实际指定移位变量的次数。有符号数字会在最重要的位位置移动。 >>>
强制数字表示无符号,并始终以零为零。