std::bitset是C++中编译期固定大小的位容器,适用于标志位管理等场景;声明需constexpr位数,支持整数/字符串初始化;提供set/reset/flip等位操作及&| ^等运算符。

std::bitset 是 C++ 标准库中用于固定大小位序列的轻量级容器,适合做编译期确定长度的位操作,比如标志位管理、状态压缩、简单布尔数组等。它不是动态容器,不支持运行时改变大小,但效率高、接口清晰、可读性强。
声明与初始化
bitset 的模板参数是位数(编译期常量),必须是整型字面值或 constexpr 表达式。
-
// 固定 8 位,全 0
std::bitset flags; -
// 用无符号整数初始化(低位对齐)
std::bitset a(0b1010'0011); // 值为 163,对应二进制 10100011 -
// 用字符串初始化(从左到右对应高位到低位)
std::bitset b("10100011"); // 同上,注意字符串是字符 '1'/'0' - // 用十六进制字符串需手动转换,bitset 不直接支持
常用位操作方法
所有操作都是按位进行,返回引用或新 bitset,安全且无符号溢出风险。
- flags.set(3); // 第 3 位(0 起始)置 1 → 00001000
- flags.reset(2); // 第 2 位清 0
- flags.flip(5); // 第 5 位取反
- flags.set(); // 全部置 1
- flags.reset(); // 全部清 0
- flags.flip(); // 全部取反
- bool b = flags[4]; // 下标访问(返回 proxy,支持读写)
复合位运算符
支持原地位运算:&=、|=、^=、>=,也支持生成新 bitset 的运算符 + 对应非原地版本(&, |, ^, >)。
立即学习“C++免费学习笔记(深入)”;
- std::bitset x("10110000"), y("00001111");
- auto z = x & y; // 00000000
- x |= y; // x 变成 10111111
- auto shifted = x // 左移两位,高位截断,低位补 0 → 11111100
查询与转换
方便调试和与其他类型交互:
- flags.count(); // 返回 1 的个数(popcount)
- flags.size(); // 返回模板参数 N(这里是 8)
- flags.any(); // 是否至少有一个 1
- flags.none(); // 是否全为 0
- flags.all(); // 是否全为 1(C++17 起)
- unsigned long val = flags.to_ulong(); // 转为 unsigned long(若能容纳)
- unsigned long long v2 = flags.to_ullong(); // C++11 起,支持更大范围
- std::string s = flags.to_string(); // 如 "10100011"(高位在前)
基本上就这些。用 bitset 不需要手动写位掩码或移位逻辑,代码更直观,编译器通常还能优化成单条 CPU 指令(如 popcnt)。注意它不适合长度不确定的场景——那种情况考虑 std::vector







