c++中bitset的使用方法_c++位集合bitset的定义与操作

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

c++中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

位运算操作

bitset 支持常见的运算符,便于进行逻辑操作:

c++中bitset的使用方法_c++位集合bitset的定义与操作

法语写作助手

法语助手旗下的AI智能写作平台,支持语法、拼写自动纠错,一键改写、润色你的法语作文。

c++中bitset的使用方法_c++位集合bitset的定义与操作31

查看详情 c++中bitset的使用方法_c++位集合bitset的定义与操作

  • ~b:按位取反
  • b1 & b2:按位与
  • b1 | b2:按位或
  • b1 ^ b2:按位异或
  • b << n:左移 n 位
  • b >> n:右移 n 位

注意:这些操作返回新的 bitset,不会修改原对象

示例:

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 使用简单,性能高,是处理位操作的理想选择。只要记住它的大小是编译期常量,不能动态调整即可。合理使用能显著提升代码清晰度和效率。

上一篇
下一篇
text=ZqhQzanResources