??Java位運算在開發(fā)中用的很少馅闽,但是源碼中用的非常多,為了不影響我們閱讀源碼的進度熙参,咱們一起來復習一下相關(guān)知識艳吠。
1、補碼的計算
整數(shù)的原碼孽椰、反碼和補碼相同
負數(shù)需要計算按照以下步驟計算昭娩,以-8為例
- 二進制原碼1111 1111 1111 1111 1111 1111 1111 1000(Java int類型32位凛篙,所有高位用1填充)
- 反碼(符號位除外,其余取反) 1111 1111 1111 1111 1111 1111 1111 0111
- 補碼(反碼加一)1111 1111 1111 1111 1111 1111 1111 1000
2栏渺、按位與&
有0則0
3呛梆、按位或|
有1則1
4、按位取反~
~-8
- 先得到補碼1111 1111 1111 1111 1111 1111 1111 1000
- 再按位取反0000 0000 0000 0000 0000 0000 0000 0111磕诊,即7
結(jié)論:~X=-(X+1)
5填物、有符號右移>>,左側(cè)空位負數(shù)補1正數(shù)補0
-8>>2=1111 1111 1111 1111 1111 1111 1111 1000>>2=1111 1111 1111 1111 1111 1111 1111 1110=-2
6霎终、無符號右移>>>滞磺,左側(cè)補0
-8>>2=1111 1111 1111 1111 1111 1111 1111 1000>>2=0011 1111 1111 1111 1111 1111 1111 1110=1073741822
7、左移<<
-8<<2
- 先得到補碼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(計算機存儲的是補碼)
- -8補碼:1111 1111 1111 1111 1111 1111 1111 1000
- -5補碼:1111 1111 1111 1111 1111 1111 1111 1011
- 0000 0000 0000 0000 0000 0000 0000 0011=3