2009-12-29 86 views
5

如果转移的号码为正>>>和>>工作方式相同。>>>与>>运营商之间的区别

如果移位数为负>>>用ls而>>操作转移填充最高位为0

我的理解是否正确填写最显著位?

如果负数在MSB设置为1时存储,而不是Java使用的2s补码方式,那么运算符的表现完全不同,那么正确吗?

+0

可能的重复项:[>>>和>>之间的区别](http://stackoverflow.com/q/2811319/1529630),[Java's >> vs >>> Operator?](http://stackoverflow.com/q/1034640/1529630) – Oriol 2016-03-29 19:56:04

回答

8

负数表示的方式称为2的补码。为了演示这是如何工作的,以-12为例。 12,二进制,是00001100(假设整数是8位,但实际上它们要大得多)。通过简单地颠倒每一位来获得2的补码,得到11110011.然后,简单地加1得到11110100.注意,如果再次应用相同的步骤,则返回正12。因为12 >>> 1应该给你00000110,这是6,而(-12)>>> 1应该给你01111010,这是122.如果你实际上在Java中试用这个,你会得到一个更大的数字,因为Java int实际上比8位大得多。

>>位移与最高位相同,所以正数保持正值,负数保持负值。 12 >> 1是00000110(仍然是6)和(-12)>> 1将是11111010这是负数6.

1

正好相反,在>>>用零填充,同时>>带有那些填充如果最高位是1。

+0

你能解释为什么'7 >>> 32 = 7'。我听说过循环移位,但我认为这只适用于'>>'。 32次移位后的'7 >>> 32'不等于零? – 2017-04-04 04:20:26

+0

@IanLimarta:如果左边是一个int,则移位量减少mod 32.在你的情况下,这意味着移位量是0,这实际上是一个无操作。请参阅[JLS](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19) – 2017-04-04 10:29:38

2

Definition of the >>> operator in the Java Language Specification

n>>>s的值是n右移小号具有零延伸的位位置。如果n为正数,则结果与n>>s相同;如果n为负,则如果左侧操作数的类型为int,则结果等于表达式(n>>s)+(2<<~s)的结果,如果左侧操作数的类型为long,则结果等于表达式(n>>s)+(2L<<~s的结果)。