java二進制數原碼補碼反碼,運算符 與(&)、非(~)、或(|)、異或(^)及位運算總結

    看過博主另一篇文章--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類型的數轉化爲二進制補碼,然後移位,有符號位移,需將移位後的二進制轉化爲原碼,無符號位移則不需要。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章