C++如何使用std::bitset进行位操作?(代码示例)

29次阅读

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

C++如何使用std::bitset进行位操作?(代码示例)

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 或手动管理 uint64_t 数组。

text=ZqhQzanResources