Java中的位運算符 &、|、^、~、<< 和 >>


一、& 按位與運算符

5 & 3 = 1

5轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0101

3轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0011

規則:對應的兩個二進制位都為1時,結果位就為1,其他情況都為0。

1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0

二、| 按位或運算符

5 | 3 = 7

5轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0101

3轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0011

規則:只要對應的二個二進位有一個為1時,結果位就為1。

1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0

三、^ 按位異或運算符

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補齊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM