2011-01-27 82 views
10

可能重複:
why is 1>>32 == 1?爲什麼(-1 >>> 32)= -1?

-1作爲int轉換爲二進制由32 1的表示。 當我右移31次時,我得到1(31 0和1)。 但是,當我將它右移32次時,我再次得到-1。 不應該等於0嗎?

+1

它看起來像Java。我不知道定義「>>>」操作符的許多語言。 – leppie 2011-01-27 07:55:46

+0

我在試圖學習Java的基礎知識時遇到了這個問題,是的,但我沒有標記它,因爲我認爲位移是一個相當通用的概念。 – user183037 2011-01-27 08:00:17

回答

17

Java規範解釋shift operators如下:

如果左邊的操作數的提升的類型是int,只有右邊的操作數的五個最低階位被用作移位距離。就好像右邊的操作數受掩碼值爲0x1f的按位邏輯AND運算符&§15.22.1)。實際使用的換檔距離總是在0到31的範圍內。

32 & 0x1f的值爲零。

如果左操作數是long,那麼你會得到正確的操作數的額外位,擴大了上限63,而不是31


爲了從轉移有什麼具體的預期值 - 1到右邊,你需要指定整數的基本二進制表示(例如二進制補碼)以及位數(例如32)。每種編程語言都可以對它們進行不同的定義,但爲了使實現更簡單,它們通常會指定移位的次數不能超過可用位數。這通常是因爲底層的CPU硬件不支持它。畢竟,如果你想移位那麼多位,左邊的操作數不再重要,因爲結果總是相同的。

相關問題