1. 程式人生 > >java二進位制數原碼補碼反碼,運算子 與(&)、非(~)、或(|)、異或(^)及位運算總結

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

    看過博主另一篇文章--Java集合--HashMap,對裡面使用的運算子及位運算不是很清楚的童鞋可以看下這篇文章,對理解hashMao原始碼很有幫助,自己也可以在程式中寫寫,逼格絕對滿分!!!

     大家都知道一個位元組是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型別的數轉化為二進位制補碼,然後移位,有符號位移,需將移位後的二進位制轉化為原碼,無符號位移則不需要。