2016-07-22 89 views
-4

我試圖執行邏輯右移和左移(使用>>>和< <)。不幸的是我看到,當移位量大於32時,所有這些都以模數旋轉,並且將位移到正確的位置。這不僅僅是在改變他們。我怎樣才能避免它?在centOS中使用java 7。 更新: 舉例打後,我認爲這是一個錯誤:java中的錯誤結果

public static void main(String[] args) { 
    int a = 0xc0000003; 
    int b = a >>> 32; 
    int c = 0xc0000003; 
    int d = c << 36; 
    System.out.println("b=" + b + ", d=" + d); 
} 

輸出b=-1073741821, d=48。爲什麼?如何像c一樣左右移動邏輯?

+2

它們被稱爲「[位移運算符](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html)」。他們*轉移*,他們不*旋轉*。你從哪裏得到旋轉的想法? – Andreas

+0

請提供一個顯示您的問題的[mcve]。 –

+2

它更可能你不知道你在做什麼比20多歲的語言有一個這樣的瑣碎的錯誤。 – eldo

回答

0

在java中它不是右手值完全轉變,但是這就是答案:

如果左側操作數升級後的類型爲int,則只有 五個最低階位的右側操作數被用作移位距離 。就好像右邊的操作數受掩碼值0x1f (0b11111)的 按位邏輯AND運算符&(第15.22.1節)的影響。因此實際使用的換檔距離始終在 範圍0至31(含)範圍內。

如果左側操作數的升級類型很長,那麼只有右側操作數的六個最低位用作移位 距離。就好像右邊的操作數受掩碼值0x3f (0b111111)的 按位邏輯AND運算符&(第15.22.1節)的影響。因此實際使用的換檔距離始終在 範圍0至63(含)範圍內。

取自The Java® Language Specification。對我而言,這種行爲不是很直觀......