资讯动态

深入理解C++ 容器 std::bitset

发布时间:2026/10/26 1:54:12 来源:尧图企业网站定制
std::bitset是 C 标准库中用于处理固定长度位序列的工具。你可以把它理解为一个长度在编译期就已确定的二进制数组它既提供了类似数组的按位访问能力又像整数一样支持整套位运算同时还会将存储空间压缩到极致理论上每个 bit 只占 1 bit 空间无额外指针开销。核心特性速览固定大小编译期确定大小N是模板参数必须在编译时是常量。一旦定义长度不可改变。空间高效标准要求以最紧凑的方式存储N个位没有动态内存分配。支持完整位运算、|、^、~、、以及对应的复合赋值运算符、|、^、、全部可用。与字符串和整数互转可以从1010这样的字符串或整数构造也能通过to_string、to_ulong、to_ullong转换回去。不是容器它没有迭代器也不能像std::vector那样动态增删元素。如果需要运行时改变长度应使用std::vectorbool或boost::dynamic_bitset。主要接口梳理构造与初始化方式说明bitsetN b;全部位初始化为0bitsetN b(42ULL);用整数的二进制表示初始化右侧若干位高位补0bitsetN b(1010);用0/1字符串初始化注意最右侧字符对应最低位b[0]bitsetN b(str, pos, n);从字符串的子串构造元素访问与查询成员函数作用b[i]返回第i位的代理引用可读可写b.test(i)返回第i位是否为1带越界检查越界抛出std::out_of_rangeb.count()返回1的个数C23 起有constexpr优化b.size()返回Nb.all()/b.any()/b.none()全部为1/ 至少一个为1/ 全部为0修改操作操作说明b.set()/b.set(i)全部置1/ 第i位置1b.reset()/b.reset(i)全部置0/ 第i位置0b.flip()/b.flip(i)全部翻转 / 第i位翻转位运算std::bitset重载了所有标准位运算符语义与整数位运算一致cppauto c a b; // 按位与 auto d a | b; // 按位或 auto e a ^ b; // 按位异或 auto f ~a; // 按位取反 auto g a 3; // 左移向高位移动 auto h a 2; // 右移向低位移动转换b.to_string()返回1010...形式的字符串。b.to_ulong()/b.to_ullong()转换为无符号整数如果N大于目标整数类型的位宽且高位有1会抛出std::overflow_error。版本演进C23 与 C26C23P2417R2将std::bitset的绝大多数成员函数标记为constexpr使其可以在编译期求值中使用。C26P2697R0新增了接受std::string_view的构造函数并进一步统一了字符串接口。#include iostream #include bitset #include string int main() { // 1. 从字符串构造右侧字符是最低位 b[0] std::bitset8 a(10110011); std::cout a a \n; // 10110011 // 2. 从整数构造 std::bitset8 b(0b01011101); // 二进制字面量 C14 std::cout b b \n; // 01011101 // 3. 查询 std::cout a[0] a[0] \n; // 1最低位 std::cout a.test(6) a.test(6) \n; // 0 std::cout a.count() a.count() \n; // 5 // 4. 修改 a.set(0); // 最低位置 1本来就是 1 a.reset(1); // 第 1 位清 0 a.flip(7); // 最高位翻转1→0 std::cout a after modification a \n; // 5. 位运算 auto c a b; auto d a | b; auto e a ^ b; std::cout a b c \n; std::cout a | b d \n; std::cout a ^ b e \n; std::cout ~a ~a \n; // 6. 移位注意方向 向高位索引移动 std::cout a 1 (a 1) \n; std::cout a 2 (a 2) \n; // 7. 转换回字符串和整数 std::string s a.to_string(); unsigned long ul a.to_ulong(); std::cout a.to_string() s \n; std::cout a.to_ulong() ul \n; return 0; }

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑