C++ bitset
在 C++ 中,std::bitset 是用于处理二进制位(bit)的固定大小容器,常用于位操作、标志位管理或优化存储。以下是详细用法指南:
C++ bitset
内容
一、基本用法
1. 头文件
#include <bitset>
2. 初始化
// 默认初始化(所有位为0)
std::bitset<8> bits1; // 00000000
// 从整数初始化
std::bitset<8> bits2(42); // 00101010
// 从二进制字符串初始化
std::bitset<8> bits3("10101010"); // 10101010
std::bitset<8> bits4("1010XXXX", 0, 8, 'X'); // 替换无效字符为0 → 10100000
二、核心操作
1. 访问和修改位
bitset<8> b(0b11100000);
// 访问(索引从右到左,索引0是最低位)
b[0] = 1; // 修改第0位 → 11100001
bool bit5 = b[5];// 获取第5位的值(0或1)
// 整体赋值
b = 0xFF; // 11111111
b = 0b1010; // 00001010 (自动截断高位)
2. 常用方法
| 方法 | 作用 | 示例 |
|---|---|---|
.set(pos) |
指定位置1 | b.set(3); → 第3位为1 |
.reset(pos) |
指定位置0 | b.reset(2); |
.flip(pos) |
指定位取反 | b.flip(4); |
.count() |
统计1的个数 | int ones = b.count(); |
.size() |
返回总位数 | int len = b.size(); |
.test(pos) |
安全访问(带范围检查) | if(b.test(7)) {...} |
.all() |
是否所有位都是1 | if(b.all()) {...} |
.any() |
是否有至少1位是1 | if(b.any()) {...} |
.none() |
是否所有位都是0 | if(b.none()) {...} |
三、位运算操作
bitset 支持所有位运算符:
bitset<4> a(0b1010);
bitset<4> b(0b1100);
a & b; // 按位与 → 1000
a | b; // 按位或 → 1110
a ^ b; // 按位异或 → 0110
~a; // 按位取反 → 0101 (实际位数由模板参数决定)
a << 2; // 左移 → 1000
b >> 1; // 右移 → 0110
四、转换操作
1. 转为字符串
bitset<8> b(42);
string s = b.to_string(); // "00101010"
string s_hex = b.to_string('*', '-'); // 用*代替1,-代替0 → "--*-*-*-"
2. 转为整型
unsigned long ulong_val = b.to_ulong();
unsigned long long ull_val = b.to_ullong(); // C++11
五、实战示例
1. 掩码操作
// 检查第3位是否被设置
bitset<8> status_reg(0b00110010);
if (status_reg.test(3)) {
cout << "Bit 3 is set!" << endl;
}
// 设置第5位为1,不影响其他位
status_reg.set(5);
2. 二进制解析
// 解析IPv4子网掩码
bitset<32> subnet_mask(0xFFFFFF00);
bitset<32> ip_address(0xC0A80101); // 192.168.1.1
bitset<32> network_id = ip_address & subnet_mask;
六、注意事项
- 编译时大小:模板参数必须是编译时常量,如
bitset<N>中的N - 越界访问:使用
operator[]时不会检查索引,建议用.test(pos)安全访问 - 字符串初始化:字符串必须只含
'0'或'1',否则抛出invalid_argument异常
七、性能与适用场景
- 优势:位操作效率高(直接映射到底层整型),内存紧凑
- 适用场景:
- 硬件寄存器操作
- 网络协议标志位解析
- 状态压缩(如算法中的visited标记)
- 位图处理
通过合理使用 bitset,可以显著提升代码可读性和性能。

浙公网安备 33010602011771号