這一塊兒也要說一下這最後一個運算符:位運算符測試
注意:本篇大部分都是講二進制的,若是不會轉換,還需去前面補補課3d
既然講到了位運算,有一個知識點是確定不能落下的:blog
那就是原碼,反碼,補碼這三個的概念效率
看圖:語法
二進制
im
嗯!感受差很少。img
對了計算機
本篇的主要內容是位運算,差點忘了移動
那就先看一下一共有那些位運算符吧
<< ,>>,>>>,&,|,^
看到這你必定會想:
這什麼鬼東西,幾個小於號大於號就說是位運算符?
還有後面三個傢伙不是邏輯運算符嗎?怎麼也是位運算符?
那麼就由我來一一解開這幾個疑問
語法:要位移的數 位運算符 位移值(移多少位)
<<:表示將要位移的數的二進制向左移,後面產生的空位補0
代碼圖:

運行圖:

沒錯,結果就是這樣。
那麼咱們應該要知道2是如何變成8的。對吧
首先應該要獲得2的二進制數:
0000 0010(這裏只有一個字節,實際是int有四個字節)
而後將它左移兩位,變成:
0000 1000
最後轉換成十進制數
就是咱們最後的結果8
看看負數
運行結果:
咱們上面說了計算機都是用補碼來計算的
因此先求出-3的二進制補碼:
原碼:1000 0011
反碼:1111 1100
補碼:1111 1101
而後左移兩位
1111 0100
獲得的是補碼,咱們能夠把補碼逆運算變成原碼
補碼:1111 0100
反碼:1111 0011
原碼:1000 1100
轉換成十進制就是-12(開頭是一,表示負數)
>>:將要位移的數的二進制向右移,
假如是正數前面補0 ,負數前面補1
代碼測試:
運行結果是:
1
-2
回到上面的操做,咱們來還原一下計算機底層是如何實現的
1.獲得要位移數的二進制數的補碼(爲了方便兩個一塊兒運算)
原碼:0000 1001 1000 0111
反碼:0000 1001 1111 1000
補碼:0000 1001 1111 1001
而後向右移動,正數前面補0,負數補1
0000 1001 >> 3
0000 0001
結果就是1
1111 1001 >> 2
1111 1110
咱們把獲得的補碼逆運算成原碼
補碼:1111 1110
反碼:1111 1101
原碼:1000 0010
獲得結果就是-2
能夠,徹底沒毛病。
接下來就這個東西了
>>>:也表示向右位移,不過它是無論正負數的,右移後前面直接補0
嗯哼,代碼試試:
結果爲:
1
536870911
同上繼續手工還原(看到第二個數,有點慌)
分開一個個來吧:
先來正數的二進制
0001 0001
右移4位
0000 0001
結果是1
第二個負數:
首先咱們應該要知道這個數怎麼會這麼大?
看我推演就知道了
前面咱們寫的二進制都是八位的對吧 八位就是一個字節,
然而int是有四個字節的,前面的計算沒有寫出前面的三個字節
是由於前面三個字節其實沒什麼很大的關係
這裏就要全寫出來了
-7實際在計算機是這樣存儲的
原碼:1000 0000 0000 0000 0000 0000 0000 0111
反碼:1111 1111 1111 1111 1111 1111 1111 1000
補碼:1111 1111 1111 1111 1111 1111 1111 1001
右移3位,前面補0:
0001 1111 1111 1111 1111 1111 1111 1111
直接算出結果(這裏是正數,無需轉換成原碼,由於三碼合一)
就是:
1+2+4+8+16+32+64+128+256+512+1024+2048....
反正最後的結果就是剛纔好長的那個
這三個位移運算符講完了
再看看咱們其它的三個邏輯運算符(就這樣叫吧)
前面連接的是表達式,這裏鏈接的是整數
&:表示將兩個數的二進制進行比較,同一位中都是1結果爲1不然爲0
|:表示將兩個數的二進制進行比較,同一位中都是0結果爲0,不然就爲1
^:表示將兩個數的二進制進行比較,同一位相同結果爲0,不相同結果爲1
實際測試:
結果爲:
8
11
3
老樣子:咱們要知道他底層是如何運算的,因此須要還原一下他的操做
先來&:
先獲得兩個數的二進制
0000 0000 0000 0000 0000 0000 0000 1001 (9)
0000 0000 0000 0000 0000 0000 0000 1010 (10)
而後進行比較,獲得結果是:
0000 0000 0000 0000 0000 0000 0000 1000
轉換成十進制就是8
第二個|:
這裏直接使用上面算出來的二進制得出結果爲:
0000 0000 0000 0000 0000 0000 0000 1011
轉換成十進制就是11
最後一個^:
同上,直接算出結果
0000 0000 0000 0000 0000 0000 0000 0011
結果就是十進制的3
到最後:
終於說完了這篇,唉。
例如:如何高效率的將2變成8
就可使用咱們的左移完成
int a = 2 << 2;