位运算入门
嵌入式每天和位打交道:开 flag、取 bit、拼寄存器。先在纸上写 4 位二进制,再对照运算。
1. 概念表
| 运算 | 含义 | 记忆口诀 |
|---|
| & | 按位与 | 有 0 则 0(常用于清零) |
| | | 按位或 | 有 1 则 1(常用于置位) |
| ^ | 按位异或 | 相同为 0(可翻转) |
| ~ | 按位取反 | 0/1 全翻 |
| << | 左移 | 乘 2 的幂次 |
| >> | 右移 | 除 2 的幂次 |
2. 完整例子:控制 bit3
C
| 1 | #include <stdio.h> |
| 2 | |
| 3 | int main(void) { |
| 4 | unsigned int reg = 0x00; |
| 5 | reg |= (1u << 3); // 打开 bit3 → 0x08 |
| 6 | printf("%#X\n", reg); |
| 7 | reg &= ~(1u << 3); // 关闭 bit3 → 0x00 |
| 8 | printf("%#X\n", reg); |
| 9 | reg |= (1u << 3); |
| 10 | unsigned int b3 = (reg >> 3) & 1u; |
| 11 | printf("bit3=%u\n", b3); |
| 12 | return 0; |
| 13 | } |
3. 拆解
- 1u << 3:无符号 1 左移 3 位,得到 0b1000
- ~(1u<<3):除 bit3 外都是 1,再 & 可清掉 bit3
- 读 bit:先右移对齐,再 & 1
4. 实际例子:标志位组合
C
| 1 | #define FLAG_RUN (1u << 0) |
| 2 | #define FLAG_ERR (1u << 1) |
| 3 | #define FLAG_BUSY (1u << 2) |
| 4 | |
| 5 | unsigned st = 0; |
| 6 | st |= FLAG_RUN; |
| 7 | if (st & FLAG_ERR) { |
| 8 | /* 出错处理 */ |
| 9 | } |