看過博主另一篇文章--Java集合--HashMap,對裏面使用的運算符及位運算不是很清楚的童鞋可以看下這篇文章,對理解hashMap源碼很有幫助,自己也可以在程序中寫寫,逼格絕對滿分!!!
大家都知道一個字節是8個二進制數,一個int是四個字節,所以一個int數據爲32個二進制數(原碼),本文所有運算都是基於二進制,十進制轉二進制不清楚的可以自行百度,廢話不多說,我們一個個來看:
一:二進制數源碼補碼反碼分析
(1)原碼
原碼上面有提到過,既轉化爲二進制數,空位補0,補齊32位,如10的原碼爲:
0000 0000 0000 0000 0000 0000 0000 1010
負數的話取絕對值轉化爲原碼,最高位補1,所以最高位也稱爲符號位,爲1的話改數位負數,0的話爲正數,所以-10的原碼爲
1000 0000 0000 0000 0000 0000 0000 1010
(2)反碼
正數的反碼跟原碼相同,負數的反碼爲除符號位外全部取反,所以-10的反碼就爲
1111 1111 1111 1111 1111 1111 1111 0101
(3)補碼
正數的補碼與原碼相同,負數的話爲原碼除符號位外全部取反,然後+1,所以-10的補碼爲:
1111 1111 1111 1111 1111 1111 1111 0101 +1 =
1111 1111 1111 1111 1111 1111 1111 0110
二:運算符
(1)與(&)
計算10&2時將10、2轉換爲二進制數爲:
0000 0000 0000 0000 0000 0000 0000 1010
0000 0000 0000 0000 0000 0000 0000 0010 &運算符表示,比較同位置的數,都爲1則爲1,否則都爲0,所以運算結果爲:
0000 0000 0000 0000 0000 0000 0000 0010 = 2
(2)或(|)
計算10|2時將10、2轉換爲二進制數爲:
0000 0000 0000 0000 0000 0000 0000 1010
0000 0000 0000 0000 0000 0000 0000 0010 |運算符表示,比較同位置的數,有一個爲1就爲1,所以運算結果爲:
0000 0000 0000 0000 0000 0000 0000 1010 = 10
(3)異或(^)
計算10^2時將10、2轉換爲二進制數爲:
0000 0000 0000 0000 0000 0000 0000 1010
0000 0000 0000 0000 0000 0000 0000 0010 ^運算符表示,比較同位置的數,相同則爲0,不同則爲1,所以運算結果爲:
0000 0000 0000 0000 0000 0000 0000 1000 = 8
(4)非(~)
非運算符算起來比較麻煩,總結之後其實就是,你對一個數x進行非操作既~x,得到的值爲-(x+1),~~x爲-(-(x+1)+1)。
三:移位運算
(1)>>右移位運算符
拿10舉例子,10的二進制爲:
0000 0000 0000 0000 0000 0000 0000 1010 10>>2右移兩位爲
00 0000 0000 0000 0000 0000 0000 0010 缺少的高位補0所以完整結果爲
0000 0000 0000 0000 0000 0000 0000 0010 = 2 相當於10/2^2
如果爲-10,則計算方法不同先取-10的補碼
1111 1111 1111 1111 1111 1111 1111 0110 右移兩位
11 1111 1111 1111 1111 1111 1111 1101然後高位補符號位,負數的符號位爲1,所以爲
1111 1111 1111 1111 1111 1111 1111 1101 然後取原碼,-1後取反,結果爲
1000 0000 0000 0000 0000 0000 0000 0011 = -3
(2)<<左移位運算符
拿10舉例子,10的二進制爲:
0000 0000 0000 0000 0000 0000 0000 1010 10<<2左移兩位爲
0000 0000 0000 0000 0000 0000 0010 10 缺少的低位補0所以完整結果爲
0000 0000 0000 0000 0000 0000 0010 1000 = 40 相當於10*2*2
負數的話,加上-就行,計算方法與右移位運算符一樣
(3)無符號右移位運算符>>>
拿10舉例子,10的二進制爲:
0000 0000 0000 0000 0000 0000 0000 1010 取補碼爲
0000 0000 0000 0000 0000 0000 0000 1010 10>>>2 右移二位,高位補0
0000 0000 0000 0000 0000 0000 0000 0010 所以結果爲2
-10的話取補碼爲:
1111 1111 1111 1111 1111 1111 1111 0110 -10>>>2 右移二位,高位補0
0011 1111 1111 1111 1111 1111 1111 1101 所以結果爲1073741821
無符號位的意思是移動後不補符號位,既將符號位當成數字,有意思的是-1>>>1能得到Integer.MAX_VALUE。
總結位運算符號就是將int類型的數轉化爲二進制補碼,然後移位,有符號位移,需將移位後的二進制轉化爲原碼,無符號位移則不需要。