所謂位運算,就是對一個比特(Bit)位進行操作。在《數據在內存中的存儲》一節中講到,比特(Bit)是一個電子元器件,8個比特構成一個字節(Byte),它已經是粒度最小的可操作單元了。
C語言提供了六種運算符
運算符 | & | | | ^ | ~ | << | >> |
---|---|---|---|---|---|---|
說明 | 按位與 | 按位或 | 按位異或 | 取反 | 左移 | 右移 |
左移運算(<<)
左移運算符<<用來把操作數的各個二進制位全部左移若干位,高位丟棄,低位補0。
右移運算(>>)
右移運算符>>用來把操作數的各個二進制位全部右移若干位,低位丟棄,高位補 0 或 1。如果數據的最高位是 0,那麼就補 0; 如果最高位是 1,那麼就補 1。
stm32庫函數編程常用的位操作
1)把變量的某位清零。
```c
1 //定義一個變量 a = 1001 1111 b (二進制數)
2 unsigned char a = 0x9f;
3
4 //對 bit2 清零
5
6 a &= ~(1<<2);
7
8 //括號中的 1 左移兩位,(1<<2)得二進制數:0000 0100 b
9 //按位取反,~(1<<2)得 1111 1011 b
10 //假如 a 中原來的值爲二進制數: a = 1001 1111 b
11 //所得的數與 a 作”位與&”運算,a = (1001 1111 b)&(1111 1011 b),
12 //經過運算後,a 的值 a=1001 1011 b
13 // a 的 bit2 位被被零,而其它位不變
2) 把變量的某幾個連續位清零
1
2 //若把 a 中的二進制位分成 2 個一組
3 //即 bit0、bit1 爲第 0 組,bit2、bit3 爲第 1 組,
4 // bit4、bit5 爲第 2 組,bit6、bit7 爲第 3 組
5 //要對第 1 組的 bit2、bit3 清零
6
7 a &= ~(3<<2*1);
8
9 //括號中的 3 左移兩位,(3<<2*1)得二進制數:0000 1100 b
10 //按位取反,~(3<<2*1)得 1111 0011 b
11 //假如 a 中原來的值爲二進制數: a = 1001 1111 b
12 //所得的數與 a 作”位與&”運算,a = (1001 1111 b)&(1111 0011 b),
13 //經過運算後,a 的值 a=1001 0011 b
14 // a 的第 1 組的 bit2、bit3 被清零,而其它位不變。
15
16 //上述(~(3<<2*1))中的(1)即爲組編號;如清零第 3 組 bit6、bit7 此處應爲 3
17 //括號中的(2)爲每組的位數,每組有 2 個二進制位;若分成 4 個一組,此處即爲 4
18 //括號中的(3)是組內所有位都爲 1 時的值;若分成 4 個一組,此處即爲二進制數“1111 b”
19
20 //例如對第 2 組 bit4、bit5 清零
21 a &= ~(3<<2*2);
3)對變量的某幾位進行賦值。
1 //a = 1000 0011 b
2 //此時對清零後的第 2 組 bit4、bit5 設置成二進制數“01 b ”
3
4 a |= (1<<2*2);
5 //a = 1001 0011 b,成功設置了第 2 組的值,其它組不變
4)對變量的某位取反
1 //a = 1001 0011 b
2 //把 bit6 取反,其它位不變
3
4 a ^=(1<<6);
5 //a = 1101 0011 b
與0異或不變,與1異或取反。