C語言基礎 位操作

2021-09-27 06:53:33 字數 2582 閱讀 7882

按位取反:~

按位或:|

按位或:^

移位運算子:

二、位欄位

4個按位邏輯運算子都用於整數資料,包括char 。之所以叫做按位運算,是因為這些操作都是針對每乙個位進行的。不影響它左右兩邊的位。不能混淆於邏輯運算子(&& 、 || 和 !)

(

10010011)&

(00111101

)//表示式

(00010001

)//結果值

用法:掩碼

所謂掩碼指的是一些設定為開(1)或者關(0)的組合位。例如:假設定義符號常量mask為2(即,二進位制為:00000010

flags = flags & mask;

//等價於flags &= mask

//00000010 = 10010010 & 00000010

像這樣的過程除了mask中的一位為1以外其他的數都是0,我們就稱為「使用掩碼

~

(10011010

)//表示式

(01100101

)//結果值

用法:清空位(設定為0)

1.清空位就是在不影響其它位的情況下關閉指定的某一位。

2.例如:假設flags是00001111,mask是10110110,利用且取反運算flags00001111& ~ mask10110110結果為:10111111

其中mask為1的位在結果中都被設定(清空)為0,flags中與mask為0的位相應的位在結果中都為改變。。簡化運算**為:flags &=~ mask

(

10010011)|

(00111101

)//表示式

(10111111

)//結果值

用法:置位(設定為1)

1.置位就是只開啟需要的特定位,同時保持其它位不變。

2.例如:假設flags是00001111,mask是10110110,利用或運算的flags00001111| mask10110110結果為:10111111

其中mask為1的位,flags與其對應的位也為1。mask中為0的位,flags與其對應的位保持不變。簡化運算**為:flags =| mask

(

10010011)^

(00111101

)//表示式

(10101110

)//結果值

int stonk =1;

int onkoo;

onkoo = stonk <<=2;

//把 4 賦給onkoo;

stonk <<=2;

//把stonk的值改為 4

int sweet =16;

int ooosw;

ooosw = sweet >>3;

//ooosw = 2,sweet的值仍然為16

sweet >>=3;

//sweet的值為2

移位用法總結:

number << n number乘以2的n次冪

number >> n 如果number為非負數,則用number除以2的n次冪

在c語言中用兩種訪問位的方法,除了上面的通過按位運算子外,還有一種就是在結構中創造位欄位。位字段的結構體格式是在結構體中加入: 表示。

例如:宣告建立乙個 4 個 1 位的字段

struct

prnt;

根據該宣告可以看出,我們平常使用結構是按型別的位元組對齊。但是通過: 新增在結構體裡面,我們可以控制位欄位。同時還可以通過普通的結構成員運算子.來給這些字段賦值:

prnt.a =0;

prnt b =

1;

但是要確保所賦的值不超過欄位的可容納範圍。

例如下面的結構體欄位

/*這裡,在stuff,fiel_1和stuff.fiel_2之間,有乙個2位的空隙;

*stuff.fiel_3將儲存在下乙個unsigned int 中 */

struct

stuff;

如果宣告的總位數超過了乙個unsigned int 型別的大小,則會用到下乙個unsigned int 的型別儲存位置。乙個欄位不允許跨越兩個unsigned int 之間的邊界。編譯器後自動移動跨界的字段,保持unsigned int 的邊界對稱。一旦發生這種情況,第乙個unsigned int 中會留下乙個未命名的「洞」

即上面的**就是使用未命名的字寬度「填充」未命名的「洞」。使用乙個寬度為0的未命名字段迫使下乙個欄位與下乙個整數對齊。

C語言常用基礎位操作

1 使用下面的 將最右邊的1改變為0,假如沒有1則結果為0 e.g.01011000 01010000 x x 1 此 可以用來判斷乙個無符號的整數是否為2的冪,假如x x 1 1,則x為2的冪,否則x不為2的冪 2 相似地,下面的 可以用來判斷乙個無符號的整數是否具備2n 1的格式 包括n 0 1...

C 位操作基礎

運算子 含義按位反 按位與按位或 按位異或 左移右移 1 按位反 一元運算子,逐位取反,產生二進位制反碼 例 10010001 01101110 2 按位與 二元運算子,逐位比較,都真才真 1 1 1 例 10010001 00110000 00010000 3 按位或 二元運算子,逐位比較,有真即...

C語言位操作

在電腦程式中,資料的位是可以操作的最小資料單位,理論上可以用 位運算 來 完成所有的運算和操作。一般的位操作是用來控制硬體的,或者做資料變換使用,但是,靈活的位操作可以有效地提高程式執行的效率。c語言提供了位運算的功 能,這使得c語言也能像組合語言一樣用來編寫系統程式。位運算子c語言提供了六種位運算...