bitset是c++中用于高效操作固定大小二进制位的类模板,定义于<bitset>头文件,支持多种初始化方式、丰富的成员函数及位运算操作,适用于状态标记、集合表示、算法优化等场景,使用简单且性能高。

在C++中,bitset 是一个非常有用的类模板,定义在 <bitset> 头文件中,用于高效地操作固定大小的二进制位集合。它适合处理标志位、状态编码、位掩码等场景,相比布尔数组或整数位运算更加直观和安全。
bitset 的定义与初始化
bitset 的大小在编译时必须确定,因为它是一个固定长度的序列。定义方式如下:
语法: std::bitset<N> name;,其中 N 是位数。
支持多种初始化方式:
立即学习“C++免费学习笔记(深入)”;
- bitset<8> b1; // 默认初始化,所有位为0
- bitset<8> b2(255); // 用整数初始化(255 = 11111111)
- bitset<8> b3(“11001100”); // 用字符串初始化
- bitset<16> b4(String(“1010”)); // 用 std::string 初始化(需注意长度)
常用成员函数与操作
bitset 提供了丰富的接口来访问和修改每一位,并支持位运算操作。
- bit access: b[i] 返回第 i 位(从右往左,索引从0开始)
- set(): 将所有位设为1,或设置指定位为1: b.set() 或 b.set(pos)
- reset(): 将所有位清零,或清零指定位置: b.reset() 或 b.reset(pos)
- flip(): 翻转所有位,或翻转某一位: b.flip() 或 b.flip(pos)
- test(pos): 检查第 pos 位是否为1,返回 bool
- any(): 是否至少有一位为1
- none(): 是否所有位都为0
- count(): 返回值为1的位的个数
- size(): 返回总位数(即 N)
- to_string(): 转换为字符串
- to_ulong() / to_ullong(): 转换为 unsigned long 或 unsigned long long
示例:
bitset<8> b(“1010”);
cout << b.count() << endl; // 输出 2
cout << b.any() << endl; // 输出 1
cout << b.none() << endl; // 输出 0
b.flip(0); // 翻转第0位
cout << b.to_string() << endl; // 输出 1011
位运算操作
- ~b:按位取反
- b1 & b2:按位与
- b1 | b2:按位或
- b1 ^ b2:按位异或
- b << n:左移 n 位
- b >> n:右移 n 位
示例:
bitset<4> a(“1010”), b(“1100”);
cout << (a & b) << endl; // 输出 1000
cout << (a | b) << endl; // 输出 1110
cout << (a << 1) << endl; // 输出 0100(左移后超出部分丢弃)
实际应用场景
bitset 常用于以下场景:
- 状态标记:如权限控制、开关状态管理
- 集合表示:每个位代表一个元素是否存在(适用于小范围整数集合)
- 算法优化:如埃拉托斯特尼筛法、状态压缩DP(状压DP)
- 通信协议解析:解析数据包中的标志位字段
例如,在实现一个简单的权限系统时:
bitset<4> permissions; // 分别表示读、写、执行、删除
permissions.set(0); // 设置“读”权限
permissions.set(1); // 设置“写”权限
if (permissions.test(0)) cout << “可读n”;
基本上就这些。bitset 使用简单,性能高,是处理位操作的理想选择。只要记住它的大小是编译期常量,不能动态调整即可。合理使用能显著提升代码清晰度和效率。


