??Java位運(yùn)算在開發(fā)中用的很少,但是源碼中用的非常多,為了不影響我們閱讀源碼的進(jìn)度,咱們一起來復(fù)習(xí)一下相關(guān)知識。
1、補(bǔ)碼的計算
整數(shù)的原碼、反碼和補(bǔ)碼相同
負(fù)數(shù)需要計算按照以下步驟計算,以-8為例
- 二進(jìn)制原碼1111 1111 1111 1111 1111 1111 1111 1000(Java int類型32位,所有高位用1填充)
- 反碼(符號位除外,其余取反) 1111 1111 1111 1111 1111 1111 1111 0111
- 補(bǔ)碼(反碼加一)1111 1111 1111 1111 1111 1111 1111 1000
2、按位與&
有0則0
3、按位或|
有1則1
4、按位取反~
~-8
- 先得到補(bǔ)碼1111 1111 1111 1111 1111 1111 1111 1000
- 再按位取反0000 0000 0000 0000 0000 0000 0000 0111,即7
結(jié)論:~X=-(X+1)
5、有符號右移>>,左側(cè)空位負(fù)數(shù)補(bǔ)1正數(shù)補(bǔ)0
-8>>2=1111 1111 1111 1111 1111 1111 1111 1000>>2=1111 1111 1111 1111 1111 1111 1111 1110=-2
6、無符號右移>>>,左側(cè)補(bǔ)0
-8>>2=1111 1111 1111 1111 1111 1111 1111 1000>>2=0011 1111 1111 1111 1111 1111 1111 1110=1073741822
7、左移<<
-8<<2
- 先得到補(bǔ)碼1111 1111 1111 1111 1111 1111 1111 1000
- 1111 1111 1111 1111 1111 1111 1111 1000<<2=1111 1111 1111 1111 1111 1111 1110 0000=-32
8、按位異或(同0異1)
-8^-5(計算機(jī)存儲的是補(bǔ)碼)
- -8補(bǔ)碼:1111 1111 1111 1111 1111 1111 1111 1000
- -5補(bǔ)碼:1111 1111 1111 1111 1111 1111 1111 1011
- 0000 0000 0000 0000 0000 0000 0000 0011=3