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

Java中的移位操作符

Java中移位操作符有三個:<<、>>、>>>,分別叫做左移位操作符、有符號右移位操作符、無符號右移操作符。

左位移操作符(<<):無論是有符號數還是無符號數,都低位補0。

有符號右移位操作符(>>):用符號擴充套件,為正高位補0,為負高位補1。

無符號右移操作符(>>>):無論是有符號數還是無符號數,都高位補0,稱為零擴充套件。(C/C++無此操作符)

小技巧:移位賦值

i >>= 10;

將i右移10位後的值再賦給i。等價於:i = i >> 10;。

移位預處理

char、byte、shor型別進行移位操作時,先會自動轉換為int型別再移位。由於int型別只有32位,所以,當出現移位:

i << 127;

時,int型的i當然不會左移127位,而只會左移32位(32 = 2^5,127 = 1111 1111)。所以,int型別移位的時候,移位數只有低5位有效。同理,long型別移位時,移位數只有低6位有效。

移位操作要注意的問題是高(低)位是補0還是補1和對char, byte, short型的操作:

(1)<< : (left-shift), 最低位補0

(2)>> : (signed right-shift), 右移過程使用符號位擴充套件(sign extension),即如果符號為為1則高位補1,  是0則補0,也就是邏輯右移

(3)>>> : (unsigned right-shit),右移過程使用零擴充套件(zero extension),即最高位一律補0,也就是算術右移

(4)移位操作的資料型別可以是byte, char, short, int, long型,但是對byte, char, short進行操作時會先把它們變成一個int型,最後得到一個int型的結果,對long型操作時得到一個long型結果,不可以對boolean型進行操作。

(5)移位操作符可以和=合併起來,即 <<= 、 >>= 和 >>>=。例如 a >>= 2; 表示將a右移兩位後的值重新賦給a。當時在使用這三個操作符對 byte, char, short型資料進行操作時要注意,例如有一下程式碼片段:

public class ShiftTest

{

    public static void main(String [] args)

    {

        byte a;

        byte b;

        byte c;

        a = 127;

        b = 127;

        c = 127;

        a <<= 2;

        System.out.println(a);

        System.out.println(b <<= 2);

        System.out.println(c << 2);

    }

}

執行結果是:

            -4

            -4

             508

這說明了在操作a <<= 2 執行過程是這樣的:先將 byte型的數 127變成int型,左移2位得到 508,然後把508賦給byte型變數a時只是簡單地"折斷"(truncate)得到數-4。編譯時編譯器不會提示你可能損失精度(實際上在本例中確實是損失精度了),但是如果你把a <<= 2改成 a = a << 2;編譯器就會提示可能損失精度了。

無符號右移位操作符“>>>”在將bit串右移位時,從bit串的最左邊填充0,這和帶符號右移位操作符“>>”不同。“>>”在將bit串右移位時,從bit串的最左邊填充原來最左邊的位。也就是說,bit串原來最左邊的位是符號位,如果為1,則在帶符號右移時最左邊始終填充1;如果為0,則在帶符號右移時最左邊始終填充0。
  移位操作符的例子見下表。

操作 結果 說明
00110010 << 2 11001000 右邊始終填充0
00110010 >> 2 00001100 結果一樣
00110010 >>> 2 00001100
10110010 >> 2 11101100 結果不同
10110010 >>> 2 00101100

“按位與”操作符“&”對兩個bit串按位進行邏輯與,“按位或”操作符“|”對兩個bit串按位進行邏輯或,“按位異或”操作符“^”對兩個bit串按位進行異或操作。運算規則如下表所示。

按位與 按位或 按位異或
0 & 0 = 0 0 | 0 = 0 0 ^ 0 = 0
0 & 1 = 0 0 | 1 = 1 0 ^ 1 = 1
1 & 0 = 0 1 | 0 = 1 1 ^ 0 = 1
1 & 1 = 1 1 | 1 = 1 1 ^ 1 = 0