1. 程式人生 > >Java中的三種移位操作

Java中的三種移位操作

考慮下面程式的輸出:

public class Main {
    static public void main(String args[]) throws Exception {
        System.out.println(  0xff >>> 7  );                    // 1
        System.out.println(  ((byte) 0xff) >>> 7  );         // 33554431
        System.out.println(  (byte) (((byte) 0xff
) >>> 7) ); // -1 } }
  1. 三種移位符號

    >> 是帶符號右移,若左運算元是正數,則高位補“0”,若左運算元是負數,則高位補“1”.

    << 將左運算元向左邊移動,並且在低位補0.

    >>> 是無符號右移,無論左運算元是正數還是負數,在高位都補“0”

  2. 三種移位符號作用的左運算元有五種:long,int,short,byte,char
    但是在作用不同的運算元型別時,其具體過程不同, 遵循一下幾個原則:

    • int移位時,左邊的運算元是32位的,此時的移位符號作用在32位bit上。如:1 >> 3
      , 是將00000000 00000000 00000000 00000001這32位向右邊移動3位。
    • long 移位時,左邊的運算元是64位的,此時移位符號作用在64位bit上。如:1L >> 3
    • short, byte,char 在移位之前首先將資料轉換為int,然後再移位,此時移位符號作用在32為bit上。如:(byte)0xff >>> 7, 是將11111111 11111111 11111111 11111111向右邊移動7位,得到00000001 11111111 11111111 11111111
  3. 有1,2可知,當左運算元是long時,移位之後得到的型別是long,當左運算元是其它四中型別時,移位之後得到的型別是int,所以如果做運算元是byte,char,short 時,你用 >>=

    ,>>>=, <<= 其實是將得到的int 做低位擷取得到的數值。

  4. 三種移位符號除了對做運算元有操作規則外,其實對右運算元也有操作規則。如果左運算元(轉換之後的)是int,那麼右運算元只有低5位有效(因為int總共就32位,11111b = 31,所以規定移動32位相當於沒有移動)。如:23 >> 33, 結果與23 >>1是一樣的,都是11;同理,如果左邊運算元是long,那麼右邊運算元只有低6位有效。

System.out.println(0xff >>> 7);
/*
0xff 本身就是一個int,其bits為:
00000000 00000000 00000000 11111111
無符號向右移動7位, 得到的bits為:
00000000 00000000 00000000 00000001
*/

System.out.println( ((byte) 0xff) >>> 7 );
/*
(byte)0xff 是一個byte,bits為:
11111111
首先轉換為int,其bits為:
11111111 11111111 11111111 11111111
向右邊無符號移動7為,得到的結果bits是:
00000001 11111111 11111111 11111111
*/

System.out.println(  (byte) (((byte) 0xff) >>> 7)  );
/*
(byte) 0xff 是一個byte,bits為:
11111111
首先轉換為int,其bits為:
11111111 11111111 11111111 11111111
向右邊無符號移動7為,得到的結果bits是:
00000001 11111111 11111111 11111111
然後轉換為byte,低位擷取得到bits: 
11111111
<在輸出的時候轉換為int,其bits為:
11111111 11111111 11111111 11111111>
*/