運算子~&
|^<<
>>
含義按位反
按位與按位或
按位異或
左移右移
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中對應位為...