所謂位運算,就是對乙個位元(bit)位進行操作。在《資料在記憶體中的儲存》一節中講到,位元(bit)是乙個電子元器件,8個位元構成乙個位元組(byte),它已經是粒度最小的可操作單元了。
c語言提供了六種運算子
運算子&|^
~<<
>>
說明按位與
按位或按位異或
取反左移
右移左移運算子《用來把運算元的各個二進位制位全部左移若干位,高位丟棄,低位補0。
右移運算子》用來把運算元的各個二進位制位全部右移若干位,低位丟棄,高位補 0 或 1。如果資料的最高位是 0,那麼就補 0;如果最高位是 1,那麼就補 1。
1)把變數的某位清零。
```c
1//定義乙個變數 a = 1001 1111 b (二進位制數)
2unsigned
char a =
0x9f;3
4//對 bit2 清零
56 a &=~
(1<<2)
;78//括號中的 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 清零
67 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 被清零,而其它位不變。
1516
//上述(~(3<<2*1))中的(1)即為組編號;如清零第 3 組 bit6、bit7 此處應為 3
17//括號中的(2)為每組的位數,每組有 2 個二進位制位;若分成 4 個一組,此處即為 4
18//括號中的(3)是組內所有位都為 1 時的值;若分成 4 個一組,此處即為二進位制數「1111 b」
1920
//例如對第 2 組 bit4、bit5 清零
21 a &=~
(3<<2*
2);
3)對變數的某幾位進行賦值。
1
//a = 1000 0011 b
2//此時對清零後的第 2 組 bit4、bit5 設定成二進位制數「01 b 」
34 a |=(
1<<2*
2);5
//a = 1001 0011 b,成功設定了第 2 組的值,其它組不變
4)對變數的某位取反
1
//a = 1001 0011 b
2//把 bit6 取反,其它位不變
34 a ^=(
1<<6)
;5//a = 1101 0011 b
與0異或不變,與1異或取反。 STM32總結之GPIO 常用庫函式
配置相關函式 1.void gpio init gpio typedef gpiox,gpio inittypedef gpio initstruct 函式解釋 gpio的初始化函式,該函式的作用是對io進行初始化。引數 1 gpiox,gpio的分組,如 gpioa,gpiob,gpioc等的巨集...
stm32之IO操作(基於庫函式)
stm32學習筆記 對於stm32f10x系列晶元的庫函式,gpio的操作函式在stm32f10x gpio.h中宣告,在stm32f10x gpio.c 中完成定義。基於庫函式的stm32的io口操作步驟 1.使能io口時鐘,函式介面 void rcc apb2periphclockcmd uin...
STM32鍵盤 庫函式
昨天晚上老大回來看我頻繁使用暫存器寫程式給出指點,告訴我盡量使用庫函式,少使用暫存器,畢竟暫存器在後面使用的時候還要乙個乙個查詢手冊可能太麻煩了,nice!這次使用庫函式操作鍵盤,很基礎的實驗,其中摻雜了之前的蜂鳴器和led內容。感覺基礎鍵盤實驗比較有價值的還是那個鍵盤操作函式,以下給出標準模板,m...