位运算可将多个布尔变量压缩至单个整数中,1位存1状态,内存降8倍、操作为单cpu指令;需用uint64_t等无符号类型,配合移位与掩码操作实现置位、清位、翻位、查位;超64位时须分块管理,如bitset或数组切片;集合运算(交、并、差、对称差)和计数(__builtin_popcountll)均通过位指令高效完成;适用于权限系统、标签匹配、状压dp、布隆过滤器等高频集合计算场景。

直接用位运算管理海量布尔变量,核心是把多个 bool 压进一个整数里——1 位存 1 个状态,不是 1 字节。这样内存直降 8 倍,操作变成 CPU 级别的单指令,快且省。
用整型当位容器:从裸位操作起步
选 uint32_t 或 uint64_t 当底层存储单元(避免有符号移位未定义行为):
- 设第 n 位(从 0 开始):
flags |= (1ULL - 清第 n 位:
flags &= ~(1ULL - 翻第 n 位:
flags ^= (1ULL - 查第 n 位:
(flags & (1ULL (括号不能少)
注意:1ULL 防溢出,~ 必须包在括号里,否则只取反常量 1。
超大集合?用 bitset 或等效切片管理
单个整数只能管 64 个元素。上百万布尔值,就得用数组或库:
- Go 中
github.com/bits-and-blooms/bitset底层是[]uint64,自动分块、寻址、扩容 - C++ 中
std::bitset<n></n>编译期定长,安全易读;动态场景可用boost::dynamic_bitset或手写vector<uint64_t></uint64_t> - 自己实现时,第 i 位对应
data[i / 64] & (1ULL
别硬写“万能 uint64”——超过 64 就得索引+偏移,封装好才可维护。
集合运算全靠位指令,不循环
两个位集 A 和 B(同长度切片),交并差补全是逐块位运算:
- 交集:
a[i] & b[i] - 并集:
a[i] | b[i] - 差集(A−B):
a[i] & ~b[i] - 对称差:
a[i] ^ b[i]
计数(Cardinality)别遍历:用 __builtin_popcountll(a[i])(GCC/Clang)或 _mm_popcnt_u64(MSVC),一条 CPU 指令统计 64 位中 1 的个数。
实战场景:权限、标签、状态压缩
典型用法不是“炫技”,而是解决真实瓶颈:
- 用户权限系统:每个 bit 代表一项权限(读/写/删/管理…),100 项仅需 2 个 uint64,查权限 O(1)
- 文章标签匹配:用户兴趣标签集 & 文章标签集 ≠ 0 → 推荐命中
- 算法竞赛状压 DP:状态 s 是一个整数,
s & (1 判断第 i 个物品是否选中 - 布隆过滤器底层:多个哈希映射到位数组,查是否存在只需几次位读取
关键不在“能不能”,而在“是否值得”——当布尔变量达万级、且频繁做集合计算时,位运算就是最优解。










