位運算

這一塊兒也要說一下這最後一個運算符:位運算符測試

注意:本篇大部分都是講二進制的,若是不會轉換,還需去前面補補課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;

相關文章
相關標籤/搜索