C 语言位掩码进阶
更新时间:2026-08-26。本文是
languages/c/主题高手层的骨架文档(占位),完整展开将在后续批次补齐。
本文要回答的问题
- 怎么用一组 bit 表示"多选标志"?
- 置位、清位、翻转、提取有哪些固定套路?
- 位图为什么是"内存效率之王"?
一、标志位组合
用一个整数的不同 bit 代表不同开关,一次就能组合传递多个标志:
c
enum { F_READ = 1 << 0, F_WRITE = 1 << 1, F_EXEC = 1 << 2 };
int flags = F_READ | F_EXEC; /* 组合 */
if (flags & F_READ) { ... } /* 判断 */| 操作 | 写法 |
|---|---|
| 置位 | `flags |
| 清位 | flags &= ~BIT; |
| 翻转 | flags ^= BIT; |
| 判断 | if (flags & BIT) |
| 提取字段 | (x >> shift) & mask |
二、位图:紧凑集合
用 N 个 bit 表示 N 个元素的"在不在",32 位整数就是一个 32 元素集合:
- 1 亿个布尔值:
bool数组要 100MB,位图只要 12.5MB。 - 集合操作(并/交/差)用一条
|/&/&~一次处理 32 个元素。 - 应用:内存页分配、布隆过滤器底层、大量开关的状态记录。
三、注意事项
- 掩码用
1u << k而不是1 << k(避免符号位问题),见 有符号与无符号。 - 移位量 ≥ 位宽是未定义行为。
- 大位图(>64 bit)用
uint64_t数组或专门库。
四、与入门层的衔接
一句话总结
位掩码是"一个整数装一堆开关"的存储艺术:置位清位翻转提取四板斧 + 位图的紧凑集合,让标志组合和集合运算都快且省。
本文为骨架文档:核心结构已就位,示例代码与实测数据将在后续批次补齐。