一、& 按位與運算符
5 & 3 = 1
5轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0101
3轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0011
規則:對應的兩個二進制位都為1時,結果位就為1,其他情況都為0。
二、| 按位或運算符
5 | 3 = 7
5轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0101
3轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0011
規則:只要對應的二個二進位有一個為1時,結果位就為1。
三、^ 按位異或運算符
5 ^ 3 = 6
5轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0101
3轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0011
異或的運算法則:
0 ⊕ 0 = 0,1 ⊕ 0 = 1,0 ⊕ 1 = 1,1 ⊕ 1 = 0(相同為0,不同為1)
這些法則與加法是相同的,只是不帶進位,所以異或常被認作不進位加法。
四、~ 按位取反運算符
取反,是 Java 使用補碼來表示二進制數,在補碼表示中,最高位為符號位,正數的符號位為0,負數的為1。
① 正數取反
~5 = -6
5 轉換為二進制數為: 0000 0000 0000 0101
得到二進制數每一位(包括符號位)取反: 1111 1111 1111 1010(注意這和原碼與反碼之間的轉換不一樣)
得到最終結果取補碼: 1000 0000 0000 0110
得到最終結果作為原碼轉換為十進制數:-6
則 5 取反為 -6 。
② 負數取反
~ (-5) = 4
-5 轉換為二進制數為: 1000 0000 0000 0101
得到二進制數取補碼: 1111 1111 1111 1011(這里和走原碼→反碼→補碼的流程一樣)
得到二進制數的補碼每一位取反: 0000 0000 0000 0100(這里和不走原碼→反碼的取反不一樣,全部位取反。到達這一步后所得的二進制數為正數,由於正數的原碼、反碼、補碼相同,后面的運算可以忽略,視此步得到的為最終結果的二進制數)
得到最終結果的取補碼: 0000 0000 0000 0100
得到最終結果的原碼轉換為十進制數:4
則 -5 取反為 4 。
注:邏輯取反符號 "!",!5 = 0,C中可以這么來,但Java中 "!"運算符不能用於int 。
五、<< 左移運算符 和 >> 右移運算符
① 將一個數的各二進制位全部左移若干位,移動的位數由右操作數指定,右操作數必須是非負值,其右邊空出的位用 0 填補,高位左移溢出則舍棄該高位。
( 2 << 1 ) 的結果為 4
2 轉換為二進制數為: 0000 0000 0000 0010
全部位左移 1 位后為: 0000 0000 0000 0100
轉化為十進制為 4 。
② 將一個數的各二進制位全部右移若干位,移動的位數由右操作數指定,右操作數必須是非負值,其左邊邊空出的位用 0 填補,低位右移移出的位則舍棄該位。
( 2 >> 1 ) 的結果為 1
2 轉換為二進制數為: 0000 0000 0000 0010
全部位右移 1 位后為: 0000 0000 0000 0001
轉化為十進制為 1 。
注:>>> 是無符號右移,忽略符號位,空位都以0補齊