C 位操作基礎

2021-10-01 04:28:51 字數 3242 閱讀 1430

運算子~&

|^<<

>>

含義按位反

按位與按位或

按位異或

左移右移

1、按位反: ~

一元運算子,逐位取反,產生二進位制反碼;

例:

~

(10010001)==

01101110

;

2、按位與: &

二元運算子,逐位比較,都真才真(1 & 1 = 1);

例:

(

10010001)&

(00110000)==

00010000

;

3、按位或: |

二元運算子,逐位比較,有真即真(1 | 0 = 1 或 1 | 1 = 1);

例:

(

11101011)|

(00100100)==

11101111

;

4、按位異或: ^

二元運算子,逐位比較,一真一假為真(1 ^ 0 = 1);

例:

(

11010011)^

(10101010)==

01111001

;

5、左移and右移: << and >>

左移運算子,將其左側運算物件的每一位向左移動右側運算物件指定的位數。左側移除值丟失,右側空出位置用0填充。

例:

(

00001010

)<<2==

(00101000);

//相當於向高位移動

右移運算子,將其左側運算物件的每一位向右移動右側運算物件指定的位數。右側移除值丟失,左側空出位置,對於無符號型別用0填充,有符號型別不確定取決於機器,填充值不確定。

例:

//若為無符號型別

(10001010

)>>2==

(00100010);

//相當於向低位移動

總的來說,左移產生新值每乙個位向低位移動,右移產生新值將每乙個位向高位移動,但是都是對副本操作,也就是說不改變原有值。若要改變可與賦值運算子結合形成<<=和》=。

num >> n;

//相當於num * pow(2,n)

num << n;

//相當於num / pow(2,n)

以上中二元運算子&、|、^、>>、《都可以與幅值運算子組合

如:val |= (0o377)

即 val = val | (0o377)

假設有兩個變數:

mask 0 0 0 0 0 0 1 0

flag 1 0 0 1 0 1 1 0

1、掩碼(mask),所謂掩碼是指一些設定為1(透明)、0(不透明)的位組合。

表示式 flag & mask

相當於用掩碼覆蓋在flags的位組合上,使mask中為1的透明可見,為0的不可見;且若flags寬度 > mask寬度,mask寬度決定運算結果的寬度。

例:

(flag & mask)

==00000010

;

2、開啟位(設定值),開啟乙個值中特定位,其他位保持不變。

表示式 flags |= mask

相當於把flags中的1號位設定為1(開啟),其他位保持不變。

例:

(flags | mask)

==10010110

;

3、關閉位(清空位),類似於開啟位,關閉特定位,其他位保持不變。

表示式 flags & ~(mask)

相當於把flags中的1號位設定為0(關閉),其他位保持不變。

例:

(flags &

(~mask))==

10010100

;

4、切換位,指開啟關閉位,關閉開啟位。

異或運算四種情況:

掩碼mask中為1,成功切換位;

1 ^ 1 = 0

1 ^ 0 = 1

掩碼mask中為0,保持不變;

0 ^ 0 = 0

0 ^ 1 = 1

例:

mask =

10110110

;flags =

00001111

;mask ^ flags =

10111001

flags中與mask中為1的位相對應的位都被切換了,mask為0相對應的flags的位保持不變;

5、檢查位的值,檢查某位是否被設定為1?不能直接比較flags與mask,即使某位為1,其他位會導致比較結果為假。因此,必須覆蓋flags中其他位,只比較1號位;

例:

if

((flags & mask)

== mask)

puts

("wow!"

);

掩碼寬度至少要與其覆蓋值相同,避免資訊漏過邊界

6、移位運算子,針對2的冪提供了快速有效的乘法和除法,類似於十進位制中移動小數點來乘以或除以10。

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

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

還可用於從較大單元中提取一些位。

例如,假設用乙個unsign char型別的值表示顏色,低階位元組儲存紅色強度,下一位元組儲存綠色強度,第三個位元組儲存藍色強度。我們可以依次提取出來儲存到3個不同的unsiged char型別中。

#define byte_mask 0xff

unsigned

long color =

0x002a162f

;unsigned

char blue, green, red;

red = color & byte_mask;

green =

(color >>8)

& byte_mask;

red =

(color >>16)

& byte_mask;

2019.12.1

修煉之路(一)

未完待續

歸期不定

by lx

C語言基礎 位操作

按位取反 按位或 按位或 移位運算子 二 位欄位 4個按位邏輯運算子都用於整數資料,包括char 之所以叫做按位運算,是因為這些操作都是針對每乙個位進行的。不影響它左右兩邊的位。不能混淆於邏輯運算子 和 10010011 00111101 表示式 00010001 結果值用法 掩碼 所謂掩碼指的是一...

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 位操作介紹

c 位操作包括兩種 傳統的c語言方式的位操作和c 中利用bitset容器的位操作 一 傳統的c方式位操作 1.基本操作 使用乙個unsigned int變數來作為位容器。2.操作符 按位或操作符 result exp1 exp2 當exp1和exp2中對應位中至少有乙個為1時,result中對應位為...