std::bitset 是编译期确定大小的位序列容器,非动态内存分配,适用于状态压缩、标志位管理等;支持整数/字符串初始化、下标访问、位运算及置位/清位/翻转操作。
std::bitset 是 C++ 标准库中用于**编译期确定大小的位序列容器**,它不是动态分配内存的 STL 容器(不满足 Allocator 要求),但用法简洁、性能极高,特别适合做**状态压缩、标志位管理、布尔数组优化**等场景。
bitset 的大小必须是编译期常量(模板参数),不能运行时传入。常见初始化方式:
std::bitset flags; → 全为 0std::bitset b(42); → 二进制 00101010(低位在右)std::bitset s("101100"); → 右对齐填充前导 0,结果为 00101100b[3] 返回引用,可读可写(支持 b[3] = true;)b.test(3) 返回 bool,越界会抛 std::out_of_range
bitset 重载了全部位运算符,支持链式操作,语义清晰:
b.set(2);(第 2 位设为 1)、b.reset(2);(设为 0)、b.flip(2);(翻转);无参数时操作全部位a & b(与)、a | b(或)、a ^ b(异或)、~a(取反)——返回新 bitset,原对象不变b 左移两位(高位丢弃,低位补 0),b >> 1 同理;原地移位用 b
b.any()(是否有 1)、b.none()(是否全 0)、b.all()(C++11 起,是否全 1)实际开发中常需与其他类型互转,或利用 bitset 压缩多状态:
b.to_ulong()(适合 ≤ 32 位)、b.to_ullong()(≤ 64 位),溢出抛异常;b.to_string() 得到 "00101100"b.count() —— 编译器通常优化为 popcnt 指令,O(1) 时间bitset 仅占 2 字节,比 vectorfor (int mask = 0; mask b(mask); ... }bitset 强大但有边界,用前需确认是否适用:
译期已知,无法像 vector 那样动态伸缩test()
std::vector(空间优化特化)或 boost::dynamic_bitset
基本上就这些。掌握 bitset 的核心是理解它“静态+位级+值语义”的定位——不是万能容器,但在状态标记、组合枚举、集合运算等场景里,又快又稳又干净。