天天看點

C語言存數組_第十二講:c語言基礎最後一講--位運算一、位運算符和位運算二、“按位與”運算符(&)三、按位與運算的用途四、位運算指派運算符五、位段

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

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

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

一、位運算符和位運算

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

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

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

C語言存數組_第十二講:c語言基礎最後一講--位運算一、位運算符和位運算二、“按位與”運算符(&)三、按位與運算的用途四、位運算指派運算符五、位段

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

(2)運算量隻能是整型或字元型的資料,不能為實型資料。

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

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

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

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

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

C語言存數組_第十二講:c語言基礎最後一講--位運算一、位運算符和位運算二、“按位與”運算符(&)三、按位與運算的用途四、位運算指派運算符五、位段

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

三、按位與運算的用途

1. 清零

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

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

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

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

C語言存數組_第十二講:c語言基礎最後一講--位運算一、位運算符和位運算二、“按位與”運算符(&)三、按位與運算的用途四、位運算指派運算符五、位段

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

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

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

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

C語言存數組_第十二講:c語言基礎最後一講--位運算一、位運算符和位運算二、“按位與”運算符(&)三、按位與運算的用途四、位運算指派運算符五、位段

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

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

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

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

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

C語言存數組_第十二講:c語言基礎最後一講--位運算一、位運算符和位運算二、“按位與”運算符(&)三、按位與運算的用途四、位運算指派運算符五、位段

5.∧運算符應用

(1)使特定位翻轉

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

C語言存數組_第十二講:c語言基礎最後一講--位運算一、位運算符和位運算二、“按位與”運算符(&)三、按位與運算的用途四、位運算指派運算符五、位段

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

C語言存數組_第十二講: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語言存數組_第十二講: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語言基礎學習全部更新完成!感謝您的閱讀!

繼續閱讀