1.位與運算 &
注意:& 和 && 是有區別的。前面這個是位與運算,後者是邏輯與運算,也就是算數運算數據類型
1 1 1 1
0 1 0 1
看看位與運算的真值表 結論:全真爲真。其餘爲假
0 & 1 0
1 & 0 0
1 & 1 1
0 & 0 0二進制
0x5b 5 0101
例如:
0xb5 & 0123 0x11
001101110
010101111
00000101110 02e總結
0x2c & 0x2b 0x28
1100
1010 1000數據
2.位或運算
真值表
0 | 0 0語言
0 | 1 1移動
1 | 0 1升級
1 | 1 1嵌入式
位或運算 (|)和邏輯或(||)區別
區別和上面的與相似 有1就爲1
027 | 0x74
00010111
01110101
0111 0111 0x77
0x1f | 0xa5 0xbf
0x5f | 0x50 0x5f
三、位異或 (^)
真值表;
1 ^ 0 1
1 ^ 1 0
0 ^ 0 0
0 ^ 1 1
從真值表能得出結論:相同的就爲0,不一樣的爲1
異或就是至關於把兩個相異的進行或操做
25 ^ 0263
0x5f ^ 0xa4 0xfb
01011111
10100100 1111 1011 0xfb
0x47 & 0x38 0xa5 | 0x4f 0x14 ^ 0124
0x0 0xef 0x40 0x004 0xa8
000010100
001010100
0100 0000
四、位取反 ~
注意:在C語言中位取反是~,邏輯取反!
規則:把二進制數進行一個變化。1變成0,0變成1
總結:任何非0的數被邏輯取反在取反就會獲得1;
任何非0數被位取反在取反就會獲得自己;
~0x5f ~0124 ~47
0xa0 065 0x2b
總結:
5.左移動 << 右移動 >>
在c語言中,進行位左移操做的時候要取決於數據類型
對於無符號數,左移時右側補0
對於無符號數,右移動左側補0;
對於有符號數, 左移動時右側補0
對於有符號數,右移時左側補符號位(若是是正數九補0,負數補1);
在嵌入式中。在研究位移動,爲了方便、快捷。咱們規定移位都是無符號的數。
6.左移 <<
s數<< 多少位
0x54 <<2
01010100 01010000 0x50
0xf4 <<1 0x6b<<6
0xe8 0xc0
7.右移
數>> 多少位
0x54 >>2
01010100
0xf4 >>4 0xd1 >>1
0x0f 0x68
升級:
0x17 的第2位變成0
00010111 結果:00010011 0x13
&
11111011 取反:00000100 把1進行變化00000001 ~(1<<2) & 0x17
00011011 0x1b 請把第2位變成1;00011111
0001101100000100 或運算 0001111100000100 和00000001 (1<<2) | 0x1b 00011111