常用位运算技巧归纳
位運算在嵌入式編程中比較常用,這里做一下歸納。
應用場景1
假設現有一個32位寄存器AX,定義低位第3位控制一個連著LED的引腳P3,定義位標志數
#define SWITCH_LED 0x0004
FAQ
- 如何將P3拉高?
拉高即置1,使用或運算,即 AX |= SWITCH_LED。
如此運算,第三位會被置高,而其他位不會受影響(因為標志數的其他位為0,AX中任何值或上0還是它本身,所以不會產生變化)。
- 如何將P3拉低?
拉低即清0,使用與運算,并且被與標志數要取反,即 AX &= ~SWITCH_LED。
如此運算,第三位會被清零,而其他位不會受影響(因為標志數的其他位經過反轉變為1,AX中任何值與上1還是它本身,所以不會產生變化)。
- 如何將P3反轉(實現LED閃爍)
反轉即取反,使用異或運算,即AX ^= SWITCH_LED
如此運算,第三位會被取反,而其他位不受影響(AX中任何值和1異或會被取反,和0異或保持不變)。
- 如何讀取P3的值?
直接求與運算:AX & SWITCH_LED,即為讀第三位的比特值。
通常在判斷語句中:if ((AX & SWITCH_LED) == SWITCH_LED),注意要帶括號防止優先級出問題。
應用場景2
實現按位加法(模2加減)。這里簡單補充一下。
- BitA 異或 BitB = BitA 算數加?BitB,即異或運算等于按位加法(不管進位,進位需要其他運算或電路產生)
如:1 異或 0 = 1,0 異或 0 = 0,1 異或 1 = 0,0?異或 1 = 1
- BitA 與 BitB = BitA 算數乘 BitB,即與運算等于按位乘法(不管進位,進位需要其他運算或電路產生)
如 1 與 0 = 0,1 與 1 = 1,0 與 1 = 0,0? 與 0 = 0
總結
- 上一篇: 人民币对美元升值了!持有两种资产能从中获
- 下一篇: QWidget::size()和QRes