Java位运算符:Java移位运算符、复合位赋值运算符及位逻辑运算符
Java?定義的位運算(bitwise operators)直接對整數類型的位進行操作,這些整數類型包括 long,int,short,char 和 byte。
位運算符主要用來對操作數二進制的位進行運算。按位運算表示按每個二進制位(bit)進行計算,其操作數和運算結果都是整型值。
Java 語言中的位運算符分為位邏輯運算符和位移運算符兩類,下面詳細介紹每類包含的運算符。
位邏輯運算符
位邏輯運算符包含 4 個:&(與)、|(或)、~(非)和 ^(異或)。除了 ~(即位取反)為單目運算符外,其余都為雙目運算符。表 1 中列出了它們的基本用法。
?
| & | 按位進行與運算(AND) | 4 & 5 | 4 |
| | | 按位進行或運算(OR) | 4 | 5 | 5 |
| ^ | 按位進行異或運算(XOR) | 4 ^ 5 | 1 |
| ~ | 按位進行取反運算(NOT) | ~ 4 | -5 |
位與運算符
位與運算符為&,其運算規則是:參與運算的數字,低位對齊,高位不足的補零,如果對應的二進制位同時為 1,那么計算結果才為 1,否則為 0。因此,任何數與 0 進行按位與運算,其結果都為 0。
例如下面的表達式:
圖 1 所示為這個運算過程,結果為 0。
?
圖 1? 100位與0的運算過程
下面是兩個非零的數字進行位與運算的過程。
這兩行語句執行后變量 Z 的值是 4,圖 2 所示為這個運算過程。
?
圖 2? 5位與12的運算過程
位或運算符
位或運算符為|,其運算規則是:參與運算的數字,低位對齊,高位不足的補零。如果對應的二進制位只要有一個為 1,那么結果就為 1;如果對應的二進制位都為 0,結果才為 0。
下面是一個使用位或運算符的表達式。
運算結果為 15,圖 3 所示為其運算過程。
?
圖 3? 11位或7的運算過程
位異或運算符
位異或運算符為^,其運算規則是:參與運算的數字,低位對齊,高位不足的補零,如果對應的二進制位相同(同時為 0 或同時為 1)時,結果為 0;如果對應的二進制位不相同,結果則為 1。
下面是一個使用位異或運算符的表達式。
運算結果為 12,圖 4 所示為其運算過程。
?
圖 4? 11位異或7的運算過程
提示:在有的高級語言中,將運算符^作為求冪運算符,要注意區分。
位取反運算符
位取反運算符為~,其運算規則是:只對一個操作數進行運算,將操作數二進制中的 1 改為 0,0 改為 1。
下面是一個使用位取反運算符的表達式。
運算結果為 65525,圖 5 所示為其運算過程。
?
圖 5? 對10位取反的運算過程
我們可以使用如下的程序來檢查這個運算結果。
編譯執行以上程序,會發現輸出的結果是 -11,而不是 65525。這是因為取反之后的結果是十六進制數,而在上面的程序中使用 %d 將輸出轉換為了十進制數。
可以使用如下語句查看十六進制結果。
可以看到輸出結果為 fff5,將它轉換為二進制是 1111111111110101。這個二進制數的最高位為 1,表示這個數為負數。除最高位外,按位取反再加 1,即得到二進制原碼 1000000000001011,用十進制數表示即為 -11。
注意:位運算符的操作數只能是整型或者字符型數據以及它們的變體,不用于 float、double 或者 long 等復雜的數據類型。
位移運算符
位移運算符用來將操作數向某個方向(向左或者右)移動指定的二進制位數。表 2 列出了 Java 語言中的兩個位移運算符,它們都屬于雙目運算符。
?
| ? | 右移位運算符 | 8?1 | 4 |
| ? | 左移位運算符 | 9?2 | 36 |
左位移運算符
左移位運算符為?,其運算規則是:按二進制形式把所有的數字向左移動對應的位數,高位移出(舍棄),低位的空位補零。
例如,將整數 11 向左位移 1 位的過程如圖 6 所示。
?
圖 6? 對11左移1位運算過程
從圖 6 中可以看到,原來數的所有二進制位都向左移動 1 位。原來位于左邊的最高位 0 被移出舍棄,再向尾部追加 0 補位。最終到的結果是 22,相當于原來數的 2 倍。
右位移運算符
右位移運算符為?,其運算規則是:按二進制形式把所有的數字向右移動對應的位數,低位移出(舍棄),高位的空位補零。
例如,將整數 11 向右位移 1 位的過程如圖 7 所示。
?
圖 7? 對11右移1位運算過程
從圖 7 中可以看到,原來數的所有二進制位都向右移動 1 位。原來位于右邊的最低位 1 被移出舍棄,再向最高位追加 0 補位。最終到的結果是 5,相當于原數整除 2 的結果。
復合位賦值運算符
所有的二進制位運算符都有一種將賦值與位運算組合在一起的簡寫形式。復合位賦值運算符由賦值運算符與位邏輯運算符和位移運算符組合而成。表 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 |
下面的程序定義了幾個 int 型變量,然后運用位賦值簡寫的形式將運算后的值賦給相應的變量
該程序的輸出為:
a = 1
b = 1
c = 6
總結
以上是生活随笔為你收集整理的Java位运算符:Java移位运算符、复合位赋值运算符及位逻辑运算符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PS快捷键
- 下一篇: RapidXml读取并修改XML文件