用整数位操作管理布尔状态最省空间高效:1个int管32开关,核心是每位对应唯一2的幂常量,通过&、|、&~实现开关控制,超百位用数组+位偏移,注意边界、并发与调试。

用一个整数的每一位代表一个开关,是管理大量布尔状态最省空间、最快响应的方式。核心不是“炫技”,而是让每个 bit 都干活——1 个 int 管 32 个开关,1 个 uint64_t 管 64 个,内存占用直降 97%,所有操作都是单条 CPU 指令。
定义清晰的状态常量
每个开关必须对应唯一的 2 的幂,确保只影响一个 bit:
- 用左移明确位序:
READ = 1U 、<code>WRITE = 1U 、<code>EXEC = 1U - 避免硬写数字:
READ = 1、WRITE = 2容易错位或重复 - 命名反映业务含义:
IS_VISIBLE比BIT_3更易维护
基础操作全靠三个位运算符
所有开关控制都围绕 &、|、&~ 展开,无需 if 判断或循环:
- 开启某状态:
flags |= WRITE(置位) - 关闭某状态:
flags &= ~EXEC(清零,~确保只翻转目标位) - 判断是否启用:
if (flags & READ)(非零即为真) - 切换状态(开变关/关变开):
flags ^= IS_DIRTY
大批量开关:用数组+位偏移定位
当开关数超百个,直接用大整数不够用,改用字节数组或 uint64_t 数组:
- 1000 个开关 →
unsigned char flags[125](125 字节,而非 1000 字节 bool 数组) - 第 i 个开关在哪:字节索引
i >> 3,位偏移i & 7 - 置位写法:
flags[i >> 3] |= (1U - 查状态写法:
(flags[i >> 3] & (1U
实战注意几个关键细节
看似简单,但踩坑多在边界和并发:
- 数组大小按“向上取整”分配:100 位需
char arr[13](100 ÷ 8 = 12.5 → 13) - 位偏移必须合法:用
i % 64前先确认i在有效范围内,否则左移行为未定义 - 多线程修改同一字节时,必须加锁或改用原子操作(如 C11
atomic_fetch_or) - 调试时打印十六进制:
printf("%02x", flags[k]),一眼看清哪几位被设了











