为什么右移算子产生零而不是一个?

时间:2010-06-09 16:35:16

标签: java bit-shift

我正在教自己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。

6 个答案:

答案 0 :(得分:9)

看起来书中有错误。

右移操作将所有位向右移位,移除最低有效位。如果您正确对齐结果(例如,通过用零填充),这会更有意义。

00001000
00000100
00000010
00000001
00000000

移入的最高位是:

  • 0如果您的电话号码是肯定的
  • 1如果您的号码是否定的。

如果您希望最终结果为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实际指定移位变量的次数。有符号数字会在最重要的位位置移动。 >>>强制数字表示无符号,并始终以零为零。