2010-06-09 85 views
3

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

这到底是怎么回事。数字是否被切断?

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

+0

您的结果对于简单地右移数字是正确的行为。 “解决方案”应该说明什么,我不明白。 – zerm 2010-06-09 16:39:17

回答

9

看起来这本书有错误。

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

00001000 
00000100 
00000010 
00000001 
00000000 

的最高位移位是:

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

如果你想最终的结果是那些然后尝试使用像-8而不是8

11111111111111111111111111111000 
11111111111111111111111111111100 
11111111111111111111111111111110 
11111111111111111111111111111111 

负数如果您使用的>>>代替>>那么零将永远被转移无论数量是正数还是负数。

+0

这听起来不像书中的错误,如果你使用4位和8位(结果可能是错误,因为Java不会让你只用4位工作),结果就不一样了。 – 2010-06-09 16:48:24

3

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

最好是把它作为所有数字都右移的操作,最右边的数字被切断和一个额外的零添加到左侧,即模式是:

00001000 
00000100 
00000010 
00000001 
00000000 
00000000 
3

从位运算符Java Tutorials Page

无符号向右移位运算符 “>>>”移动零到最左边的 位置,而最左边的位置 后“>>”依赖于符号扩展。

由于8是正的,所以零移位。如果i为负值,则会改为移位(保持整数上的相同符号)。

+0

但是这并不能解释为什么如果我们移动32位'>> 32',我们会得到相同的数字! – Pacerier 2011-11-18 03:11:40

2

右移操作符将您的位移动到右侧,即

01000 
00100 
00010 
00001 

右移将填满最左边的位,并具有与移位前相同的值。 由于最左边的位是符号,所以正值将被零填充,负值将被填充1。

1

如果设置在INT像

int i = 1 << 31; 

的higest位你会看到所描述的行为,该标志将换挡过程中被保留。 我认为这是一个说明操作的例子。

10000000000000000000000000000000 
11000000000000000000000000000000 
11100000000000000000000000000000 
11110000000000000000000000000000 
11111000000000000000000000000000 
11111100000000000000000000000000 
11111110000000000000000000000000 
.... 
11111111111111111111111111111000 
11111111111111111111111111111100 
11111111111111111111111111111110 
11111111111111111111111111111111 
+0

你有没有找到错位的方向? – Pacerier 2011-11-18 03:12:58

1

你似乎认为variable >>= 1将一个移动到变量上。 1实际上指定多少次来移动变量。无论位于最重要的位置,签名的数字都会改变。 >>>强制该数字无符号行为并始终在零点上移动。

相关问题