第十二講:c語言基礎最後一講--位運算

本文約2500字,主要講了位運算符和位運算、“按位與”運算符(&)、按位與運算的用途、位運算賦值運算符、位段等。

帶你進入C語言的世界,入門C語言,後邊將持續更新。可以收藏學習。想了解 等,請點擊該處跳轉閱讀。

本文全乾貨,新手必備,感謝你的閱讀,祝你學有所成,生活愉快!


一、位運算符和位運算

位運算是指按二進制位進行的運算。因為在系統軟件中,常要處理二進制位的問題。

例如:將一個存儲單元中的各二進制位左移或右移一位,兩個數按位相加等。

C語言提供位運算的功能,與其他高級語言(如PASCAL)相比,具有很大的優越性。

第十二講:c語言基礎最後一講--位運算

(1)位運算符中除~以外,均為二目(元)運算符,即要求兩側各有一個運算量。

(2)運算量只能是整型或字符型的數據,不能為實型數據。

二、“按位與”運算符(&)

含義:參加運算的兩個數據,按二進制位進行“與”運算。如果兩個相應的二進制位都為1,則該位的結果值為1;否則為0。

例如: 0&0=0,0&1=0,

1&0=0,1&1=1。

注意:3&5並不等於8,應該是按位與運算:

第十二講:c語言基礎最後一講--位運算

如果參加&運算的是負數(如-3&-5),則要以補碼形式表示為二進制數,然後再按位進行“與”運算。

三、按位與運算的用途

1. 清零

若想對一個存儲單元清零,即使其全部二進制位為0,只要找一個二進制數,其中各個位符合以下條件:原來的數中為1的位,新數中相應位為0。然後使二者進行&運算,即可達到清零目的。

例如:要求將二進制數11100101的第2位清零

2.取一個數中某些指定位

例如:我們需要對一個字型數據取出其低8位的值時,我們可以這麼做。

第十二講:c語言基礎最後一講--位運算

3.“按位或”運算符(|)

兩個相應的二進制位中只要有一個為1,該位的結果值為1。即:

0|0=0,0|1=1,

1|0=1,1|1=1。

第十二講:c語言基礎最後一講--位運算

4.“異或”運算符(∧)

異或運算符∧也稱XOR運算符。

它的規則是:若參加運算的兩個二進制位同號則結果為0(假),異號則結果為1(真)即:

0∧0=0,0∧1=1,

1∧0=1,1∧1=0。

第十二講:c語言基礎最後一講--位運算

5.∧運算符應用

(1)使特定位翻轉

設有01111010,想使其低4位翻轉,即1變為0,0變為1。可以將它與00001111進行∧運算,即:

第十二講:c語言基礎最後一講--位運算

(2)與0相∧,保留原值

第十二講:c語言基礎最後一講--位運算

因為原數中的1與0進行∧運算得1,0∧0得0,故保留原數。

(3)交換兩個值,不用臨時變量

例如:a=3,b=4,現在想將a、b變量的值交換位置,我們傳統的做法是定義多一個temp變量,而現在temp去度蜜月了,怎麼辦?

我們可以這樣做:

a=a∧b;

b=b∧a;

a=a∧b; 這種方法也常應用於加密算法。

6.“取反”運算符(~)

~是一個單目(元)運算符,用來對一個二進制數按位取反,即將0變1,將1變0。

例如,~025是對八進制數25(即二進制數00010101)按位求反。

第十二講:c語言基礎最後一講--位運算

7.左移運算符(<<)

左移運算符是用來將一個數的各二進制位全部左移若干位。

例如:a =<< 2 將a的二進制數左移2位,右邊補0。

若a=15,即二進制數00001111,左移2位得00111100,(十進制數60);若高位左移後溢出,捨棄。

左移1位相當於該數乘以2,左移2位相當於該數乘以4,15<<2=60,即乘了4。

但此結論只適用於該數左移時被溢出捨棄的高位中不包含1的情況。

假設以一個字節(8位)存一個整數,若a為無符號整型變量,則a=64時,左移一位時溢出的是0,而左移2位時,溢出的高位中包含1。

8.右移運算符(>>)

右移運算符是a>>2表示將a的各二進制位右移2位,移到右端的低位被捨棄,對無符號數,高位補0。

例如:a=017時:a的值用二進制形式表示為00001111,捨棄低2位11,得到a >> 2 == 00000011

右移一位相當於除以2右移n位相當於除以2^n。

在右移時,需要注意符號位問題:

對無符號數,右移時左邊高位移入0;

對於有符號的值,如果原來符號位為0(該數為正),則左邊也是移入0。

如果符號位原來為1(即負數), 則左邊移入0還是1,要取決於所用的計算機系統。有的系統移入0,有的系統移入1。

移入0的稱為“邏輯右移”, 即簡單右移;移入1的稱為“算術右移”。

例:a的值是十進制數 -2:

a == 1111 1110(用二進制形式表示)

無符號數:a>>1: 0111 1111 (邏輯右移時)

有符號數:a>>1: 1111 1111 (算術右移時)

四、位運算賦值運算符

位運算符與賦值運算符可以組成複合賦值運算符。

例如:&=, |=, >>=, <<=, ∧=

a & = b 相當於 a = a & b

a << =2 相當於 a = a << 2

五、位段

信息的存取一般以字節為單位。實際上,有時存儲一個信息不必用一個或多個字節。

例如,“真”或“假”用0或1表示,只需1位即可。

在計算機用於過程控制、參數檢測或數據通信領域時,控制信息往往只佔一個字節中的一個或幾個二進制位,常常在一個字節中放幾個信息。

C語言允許在一個結構體中以位為單位來指定其成員所佔內存長度,這種以位為單位的成員稱為“位段”或稱“位域” ( bit field) 。利用位段能夠用較少的位數存儲數據。

struct packed-data

{ unsigned a:2;

unsigned b:6;

unsigned c:4;

unsigned d:4;

int i;

}data;

關於位段的定義和引用的說明:

(1)位段成員的類型必須指定為unsigned或int類型。

(2) 若某一位段要從另一個字開始存放,可用以下形式定義:

unsigned a:1;

unsigned b:2;一個存儲單元

unsigned:0;

unsigned c:3;另一存儲單元

a、b、c應連續存放在一個存儲單元中,由於用了長度為0的位段,其作用是使下一個位段從下一個存儲單元開始存放。因此,只將a、b存儲在一個存儲單元中,c另存在下一個單元(“存儲單元”可能是一個字節,也可能是2個字節,視不同的編譯系統而異)。

(3) 一個位段必須存儲在同一存儲單元中,不能跨兩個單元。如果第一個單元空間不能容納下一個位段,則該空間不用,而從下一個單元起存放該位段。

(4) 可以定義無名位段。

(5) 位段的長度不能大於存儲單元的長度,也不能定義位段數組。

(6) 位段可以用整型格式符輸出。

(7) 位段可以在數值表達式中引用,它會被系統自動地轉換成整型數。


至此,C語言基礎學習全部更新完成!感謝您的閱讀!


分享到:


相關文章: