3

我正在自学 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

这里发生了什么。数字被切断了吗?

我正在使用 jdk1.6.0_20 64bit。本书使用jdk1.5 32bit。

4

6 回答 6

10

书上好像有错误。

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

00001000
00000100
00000010
00000001
00000000

移入的最高位是:

  • 0 如果你的数字是正数
  • 1 如果你的数字是负数。

如果您希望最终结果为 1,请尝试使用负数,例如 -8 而不是 8。

11111111111111111111111111111000
11111111111111111111111111111100
11111111111111111111111111111110
11111111111111111111111111111111

如果您使用>>>而不是,>>则无论数字是正数还是负数,都将始终移入零。

于 2010-06-09T16:38:09.690 回答
3

当给定正整数作为输入时,右移运算符最终产生零是正确的。

最好将其视为所有数字都向右移动,最右边的数字被切断并在左边添加一个额外的零的操作,即模式是:

00001000
00000100
00000010
00000001
00000000
00000000
于 2010-06-09T16:39:04.947 回答
3

从按位运算符Java 教程页面

无符号右移运算符“>>>”将零移到最左边的位置,而“>>”之后的最左边的位置取决于符号扩展。

因为 8 是正数,所以偏移了一个零。如果i是负数,则将移位一个(以保持整数上的相同符号)。

于 2010-06-09T16:40:22.967 回答
2

右移运算符将您的位向右移动,即

01000
00100
00010
00001

右移将用与移位前相同的值“填充”最左边的位。并且由于最左边的位是符号,正值将用零填充,负值将用一填充。

于 2010-06-09T16:43:09.543 回答
1

如果您在 int 中设置最高位,例如

int i = 1 << 31;

您将看到所描述的行为,该标志将在轮班期间保留。我认为这是一个旨在说明操作的示例。

10000000000000000000000000000000
11000000000000000000000000000000
11100000000000000000000000000000
11110000000000000000000000000000
11111000000000000000000000000000
11111100000000000000000000000000
11111110000000000000000000000000
....
11111111111111111111111111111000
11111111111111111111111111111100
11111111111111111111111111111110
11111111111111111111111111111111
于 2010-06-09T16:45:43.500 回答
1

您似乎认为variable >>= 1将 1 转移到变量上。1实际上指定移动变量的次数。有符号的数字在最高有效位的任何位置上移动。 >>>强制数字无符号并始终移动为零。

于 2010-06-09T17:14:30.357 回答