天天看點

Java位運算符:Java移位運算符、複合位指派運算符及位邏輯運算符

位運算符主要用來對操作數二進制的位進行運算。按位運算表示按每個二進制位(bit)進行計算,其操作數和運算結果都是整型值。

Java 語言中的位運算符分為位邏輯運算符和位移運算符兩類,下面詳細介紹每類包含的運算符。

位邏輯運算符

位邏輯運算符包含 4 個:&(與)、|(或)、~(非)和 ^(異或)。除了 ~(即位取反)為單目運算符外,其餘都為雙目運算符。表 1 中列出了它們的基本用法。

表1 位邏輯運算符

運算符 含義 執行個體 結果
& 按位進行與運算 4 & 5 4
| 按位進行或運算 4 | 5 5
^ 按位進行異或運算 4 ^ 5 1
~ 按位進行取反運算 ~ 4 -5

位與運算符

位與運算符為 &,其運算規則是:參與運算的數字,低位對齊,高位不足的補零,如果對應的二進制位同時為 1,那麼計算結果才為 1,否則為 0。是以,任何數與 0 進行按位與運算,其結果都為 0。

例如下面的表達式:

100&0      

圖 1 所示為這個運算過程,結果為 0。

Java位運算符:Java移位運算符、複合位指派運算符及位邏輯運算符

圖1 100 位與 0 的運算過程

下面是兩個非零的數字進行位與運算的過程。

  1. int x=5,y=12;//建立整型變量儲存兩個數
  2. int z=x&y;//對這兩個數進行位與運算,結果儲存到z

這兩行語句執行後變量 Z 的值是 4,圖 2 所示為這個運算過程。

Java位運算符:Java移位運算符、複合位指派運算符及位邏輯運算符

圖2 5 位與 12 的運算過程

位或運算符

位或運算符為 |,其運算規則是:參與運算的數字,低位對齊,高位不足的補零。如果對應的二進制位隻要有一個為 1,那麼結果就為 1;如果對應的二進制位都為 0,結果才為 0。

下面是一個使用位或運算符的表達式。

11|7      

運算結果為 15,圖 3 所示為其運算過程。

Java位運算符:Java移位運算符、複合位指派運算符及位邏輯運算符

圖3 11 位或 7 的運算過程

位異或運算符

位異或運算符為 ^,其運算規則是:參與運算的數字,低位對齊,高位不足的補零,如果對應的二進制位相同(同時為 0 或同時為 1)時,結果為 0;如果對應的二進制位不相同,結果則為 1。

下面是一個使用位異或運算符的表達式。

11^7      

運算結果為 12,圖 4 所示為其運算過程。

Java位運算符:Java移位運算符、複合位指派運算符及位邏輯運算符

圖4 11 位異或 7 的運算過程

提示:在有的進階語言中,将運算符 ^ 作為求幂運算符,要注意區分。

位取反運算符

位取反運算符為 ~,其運算規則是:隻對一個操作數進行運算,将操作數二進制中的 1 改為 0,0 改為 1。

下面是一個使用位取反運算符的表達式。

~10      

運算結果為 65525,圖 5 所示為其運算過程。

Java位運算符:Java移位運算符、複合位指派運算符及位邏輯運算符

圖5 對 10 位取反的運算過程

我們可以使用如下的程式來檢查這個運算結果。

  1. int i=10;
  2. System.out.printf("%d \n",~i);

編譯執行以上程式,會發現輸出的結果是 -11,而不是 65525。這是因為取反之後的結果是十六進制數,而在上面的程式中使用 %d 将輸出轉換為了十進制數。

可以使用如下語句檢視十六進制結果。

  1. int i=10;
  2. System.out.printf("%x \n",~i);

可以看到輸出結果為 fff5,将它轉換為二進制是 1111111111110101。這個二進制數的最高位為 1,表示這個數為負數。除最高位外,按位取反再加 1,即得到二進制原碼 1000000000001011,用十進制數表示即為 -11。

注意:位運算符的操作數隻能是整型或者字元型資料以及它們的變體,不用于 float、double 或者 long 等複雜的資料類型。

位移運算符

位移運算符用來将操作數向某個方向(向左或者右)移動指定的二進制位數。表 2 列出了 Java 語言中的兩個位移運算符,它們都屬于雙目運算符。

表2 位移運算符

運算符 含義 執行個體 結果
» 右移位運算符 8»1 4
« 左移位運算符 9«2 36

左位移運算符

左移位運算符為 «,其運算規則是:按二進制形式把所有的數字向左移動對應的位數,高位移出(舍棄),低位的空位補零。

例如,将整數 11 向左位移 1 位的過程如圖 6 所示。

Java位運算符:Java移位運算符、複合位指派運算符及位邏輯運算符

圖6 對 11 左移 1 位運算過程

從圖 6 中可以看到,原來數的所有二進制位都向左移動 1 位。原來位于左邊的最高位 0 被移出舍棄,再向尾部追加 0 補位。最終到的結果是 22,相當于原來數的 2 倍。

右位移運算符

右位移運算符為 »,其運算規則是:按二進制形式把所有的數字向右移動對應的位數,低位移出(舍棄),高位的空位補零。

例如,将整數 11 向右位移 1 位的過程如圖 7 所示。

Java位運算符:Java移位運算符、複合位指派運算符及位邏輯運算符

圖7 對 11 右移 1 位運算過程

從圖 7 中可以看到,原來數的所有二進制位都向右移動 1 位。原來位于右邊的最低位 1 被移出舍棄,再向最高位追加 0 補位。最終到的結果是 5,相當于原數整除 2 的結果。

複合位指派運算符

複合位指派運算符由指派運算符與位邏輯運算符和位移運算符組合而成。表 3 列出了組合後的複合位指派運算符。

表3 複合位指派運算符

運算符 含義 執行個體 結果
&= 按位與指派 num1 &= num2 等價于 num 1=num 1 & num2
\= 按位或指派 num1 |= num2 等價于 num 1=num 1 | num2
^= 按位異或指派 num1 ^= num2 等價于 num 1=num 1 ^ num2
~= 按位取反指派 num1 ~= num2 等價于 num 1=num 1 ~ num2
«= 按位左移指派 num1 «= num2 等價于 num 1=num 1 « num2
»= 按位右移指派 num1 »= num2 等價于 num 1=num 1 » num2