位运算入门

嵌入式每天和位打交道:开 flag、取 bit、拼寄存器。先在纸上写 4 位二进制,再对照运算。

1. 概念表

运算含义记忆口诀
&按位与有 0 则 0(常用于清零)
|按位或有 1 则 1(常用于置位)
^按位异或相同为 0(可翻转)
~按位取反0/1 全翻
<<左移乘 2 的幂次
>>右移除 2 的幂次

2. 完整例子:控制 bit3

C
1#include <stdio.h>
2 
3int 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. 拆解

4. 实际例子:标志位组合

C
1#define FLAG_RUN (1u << 0)
2#define FLAG_ERR (1u << 1)
3#define FLAG_BUSY (1u << 2)
4 
5unsigned st = 0;
6st |= FLAG_RUN;
7if (st & FLAG_ERR) {
8 /* 出错处理 */
9}