2014-10-20 77 views
0

我初學java的...我已經試過很多,但找不到辦法以下行邏輯右移操作

的System.out.println(-1 >>> 1);

給出2147483647?

任何人都可以幫助我嗎?

+1

這就是*按位*右移操作符 – Yetti99 2014-10-20 13:53:23

+1

您的意思是說您無法得到這一行來給出您期望的結果,或者它給了您所寫的結果,但您不明白爲什麼? – 2014-10-20 13:55:14

+0

是的,我不明白結果 – 2014-10-20 13:57:31

回答

1

>>>是按位右移運算符,帶有0符號擴展 - 換句話說,從左邊的「傳入」的所有位填充0。

-1由32位表示,它們全部爲1.當您向右移位1位且符號擴展爲0時,最終的結果是31位底部位仍爲1,而頂部位爲0 (符號位),所以你最終得到Integer.MAX_VALUE - 這是2147483647,而不是2147483648作爲你的文章狀態。

還是在JLS來講,從section 15.19

n >>>s值是n右移s位零擴展,在這裏的位置:

如果n是肯定的,那麼結果與n >> s相同。

如果n爲負值且左側操作數的類型爲int,則結果等於表達式(n >> s) + (2 << ~s)的結果。

如果n爲負值且左側操作數的類型很長,則結果等於表達式(n >> s) + (2L << ~s)的結果。

這個定義最終會帶來一點痛苦 - 使用IMO的「0符號擴展右移」解釋更容易。

+0

@JusticeBauer:請不要使用評論提請注意完全無關的其他問題。 – 2014-10-22 05:43:23

+0

你有最高的選票之一,所以認爲你可能有一個線索。我沒有任何其他方式聯繫本網站的人 – 2014-10-22 11:04:14

+0

@JusticeBauer:這並不意味着留下隨機問題的評論是正確的方法去做事情。*故意*你不能要求特定的用戶尋求幫助 - 相反,你寫出最好的問題,並讓那些願意幫助找到它的人。 – 2014-10-22 11:45:49

3

這是因爲binary representation-111111111111111111111111111111111。當你對它執行一個無符號的右位移操作(>>>)時,它將所有位向右移動參數(在這種情況下爲1)並用零填充左邊的空白空間,所以你得到了01111111111111111111111111111111這是二進制表示Integer.MAX_VALUE = 2147483647(不知道你從哪裏得到了2147483648)。

+0

是的結果是2147483647 – 2014-10-20 14:03:50