位运算存布尔标志更省空间,因1个bool占1字节(8位),而1个int(4字节)可存32个1位标志;通过左移(如1

为什么用位运算存布尔标志比用 bool 数组更省空间
一个 bool 在多数编译器里占 1 字节(8 位),哪怕只存 true/false;而一个 int(通常 4 字节)能塞下 32 个独立布尔状态——只要每个状态只占 1 位。关键不是“能不能”,而是“怎么安全地读写不串位”。
如何定义和设置单个标志位
用左移操作符 定义标志常量,确保各标志互不重叠:
constexpr int FLAG_A = 1 <p>设置某位用按位或 <code>|=</code>:</p>
-
flags |= FLAG_B;—— 置位,不影响其他位 -
flags &= ~FLAG_C;—— 清位,注意取反符号~作用于整个常量 -
flags ^= FLAG_A;—— 翻转位(true↔false)
如何安全地读取和批量操作
判断某位是否为 1,必须用 & 并比较非零,不能直接用 == 1:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
(flags & FLAG_B) != 0✅ 正确(即使FLAG_B是0x0002,与结果也是0x0002,非零) -
(flags & FLAG_B) == FLAG_B✅ 等价但稍冗余 -
flags & FLAG_B == 1❌ 错误:运算优先级导致等价于flags & (FLAG_B == 1)
批量设置多个标志可一次或:flags |= FLAG_A | FLAG_C | FLAG_D;;批量清除用:flags &= ~(FLAG_B | FLAG_D);
容易踩的坑:符号位、溢出与跨平台兼容性
用 int 存标志时,最高位(第 31 位)是符号位,若被置 1,值变负数——不影响位运算本身,但可能干扰调试输出或传给期望非负参数的函数。
- 推荐改用无符号类型:
uint32_t或unsigned int,避免符号扩展问题 - 不要用
1 这类表达式在 <code>int上——1是有符号整数,左移超限是未定义行为 - 若需超过 32 个标志,别硬撑:
std::bitset或uint64_t更清晰,也避免手写掩码出错
真正麻烦的不是怎么写,而是团队里有人随手写 flags = FLAG_A + FLAG_B; —— 加法会崩,必须全程坚持位运算符。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










