2009-12-29 87 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的結果)。