10
-1作爲int轉換爲二進制由32 1的表示。 當我右移31次時,我得到1(31 0和1)。 但是,當我將它右移32次時,我再次得到-1。 不應該等於0嗎?
-1作爲int轉換爲二進制由32 1的表示。 當我右移31次時,我得到1(31 0和1)。 但是,當我將它右移32次時,我再次得到-1。 不應該等於0嗎?
Java規範解釋shift operators如下:
如果左邊的操作數的提升的類型是
int
,只有右邊的操作數的五個最低階位被用作移位距離。就好像右邊的操作數受掩碼值爲0x1f
的按位邏輯AND運算符&
(§15.22.1)。實際使用的換檔距離總是在0到31的範圍內。
32 & 0x1f
的值爲零。
如果左操作數是long
,那麼你會得到正確的操作數的額外位,擴大了上限63,而不是31
爲了從轉移有什麼具體的預期值 - 1到右邊,你需要指定整數的基本二進制表示(例如二進制補碼)以及位數(例如32)。每種編程語言都可以對它們進行不同的定義,但爲了使實現更簡單,它們通常會指定移位的次數不能超過可用位數。這通常是因爲底層的CPU硬件不支持它。畢竟,如果你想移位那麼多位,左邊的操作數不再重要,因爲結果總是相同的。
它看起來像Java。我不知道定義「>>>」操作符的許多語言。 – leppie 2011-01-27 07:55:46
我在試圖學習Java的基礎知識時遇到了這個問題,是的,但我沒有標記它,因爲我認爲位移是一個相當通用的概念。 – user183037 2011-01-27 08:00:17