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;

六、注意事项

  1. 编译时大小:模板参数必须是编译时常量,如 bitset<N> 中的 N
  2. 越界访问:使用 operator[] 时不会检查索引,建议用 .test(pos) 安全访问
  3. 字符串初始化:字符串必须只含 '0''1',否则抛出 invalid_argument 异常

七、性能与适用场景

  • 优势:位操作效率高(直接映射到底层整型),内存紧凑
  • 适用场景
    • 硬件寄存器操作
    • 网络协议标志位解析
    • 状态压缩(如算法中的visited标记)
    • 位图处理

通过合理使用 bitset,可以显著提升代码可读性和性能。

posted @ 2025-04-01 21:54  Gold_stein  阅读(177)  评论(0)    收藏  举报