2015-03-31 67 views
0

這裏的一個微小的java程序邏輯和算術移位的輸出

public class otherclass { 
public static void main(String[]args){ 
     byte a=-5; 

     byte d= (byte) (a>>>1); 
     System.out.println(d); 
     byte e= (byte) (a>>>2); 
     System.out.println(e); 
     byte f= (byte) (a>>1); 
     System.out.println(f); 
     byte g= (byte) (a>>2); 
     System.out.println(g); 
} 
} 

輸出:

-3 
-2 
-3 
-2 

第二兩個輸出(那些-3和-2的邏輯移位的)我明白了。

負5是11111011

算術移位向右移動並在左側的額外添加的位是一樣的MSB。所以一個移動使得11111101是負數3.負數2也是好的。

邏輯轉變應該是零添加到左側。 11111011應該變成01111101這就是125.它怎樣輸出負值3?

+0

注意,在類型'int'(4個字節)的值發生的偏移。 – 2015-03-31 22:35:52

+0

嗯,你是什麼意思?它不適用於字節變量? – 2015-03-31 22:36:30

+0

它是一個整數類型,由由哪種類型確定的特定字節數表示。例如,'int'有32個字節。 'short'是16個字節,而'byte'是8。我不明白@SotiriosDelimanolis評論或者雖然 – 2015-03-31 22:38:56

回答

4

缺少的部分的信息是Java促進值int當比特移位它們,稱爲二進制數值提升。該byte值提升到int他們被轉移之前,則發生偏移,然後將它們轉換回byte

-5 as byte : 11111011 
-5 as int : 11111111 11111111 11111111 11111011 
Bit shifted : 01111111 11111111 11111111 11111101 

零移入,但劇組回byte拋棄這一切,但最後8位反正。

Cast to byte: 11111101 (-3) 

如果您希望>>>操作表現得好像沒有二進制數值提升,那麼你就必須從提升int屏蔽掉最後8位。

byte d= (byte) ((a & 0xFF)>>>1); 
System.out.println(d); 
byte e= (byte) ((a & 0xFF)>>>2); 
System.out.println(e); 

輸出:

125 
62 

這裏發生了什麼:

-5 as byte : 11111011 
-5 as int : 11111111 11111111 11111111 11111011 
Bit masked : 00000000 00000000 00000000 11111011 
Bit shifted : 00000000 00000000 00000000 01111101 

零移入和以前一樣,但劇組回byte拋棄這一切,但最後8位反正。

Cast to byte: 01111101 (125) 

請注意,這將與>>>>>發生,所以只能做到位,並與0xFF>>>操作。

+0

我明白了。那麼回答這個問題。感謝那。但是現在我需要知道一種讓java不做這種提升的轉變方式。我想按照原樣對字節進行轉換。 – 2015-03-31 22:38:32

+0

我已經添加了解決方法。 – rgettman 2015-03-31 22:44:02

+0

非常好的解釋! – 2015-03-31 22:44:34