#9968. bitset笔记

bitset笔记

bitset 常用函数笔记

一、概述

std::bitset 是 C++ 标准库中固定大小的位集合容器,以 bit 为单位存储数据,空间效率极高,支持丰富的位运算操作。

  • 头文件:#include <bitset>
  • 核心特点:大小 N 必须是编译期常量,不能动态改变
  • 下标规则:从右往左编号,最右侧为第 0 位

二、定义与构造

写法 说明
bitset<N> bs; 构造大小为 N 的 bitset,所有位初始为 0
bitset<N> bs(val); 用无符号整数 val 初始化
bitset<N> bs(str); 用 01 字符串 str 初始化
bitset<N> bs(str, pos, len); 从字符串第 pos 位开始取 len 个字符初始化

示例:

bitset<8> b1;          // 00000000
bitset<8> b2(10);      // 00001010
bitset<8> b3("1010");  // 00001010

三、常用成员函数

1. 访问与查询

函数 功能
bs[i] 访问第 i 位(可读可写)
bs.test(i) 返回第 i 位的值,越界抛异常
bs.count() 返回 1 的个数
bs.size() 返回总位数 N

2. 修改操作

函数 功能
bs.set() 所有位置 1
bs.set(i) 第 i 位置 1
bs.set(i, val) 第 i 位设为 val(0 或 1)
bs.reset() 所有位置 0
bs.reset(i) 第 i 位置 0
bs.flip() 所有位取反
bs.flip(i) 第 i 位取反

3. 状态判断

函数 功能
bs.any() 存在至少一个 1 则返回 true
bs.none() 全为 0 则返回 true
bs.all() 全为 1 则返回 true(C++11)

4. 类型转换

函数 功能
bs.to_string() 转为 string 类型的 01 串
bs.to_ulong() 转为 unsigned long
bs.to_ullong() 转为 unsigned long long(C++11)

四、支持的位运算符

bitset 可直接使用位运算符,操作简洁高效:

  • 按位与:a & b
  • 按位或:a | b
  • 按位异或:a ^ b
  • 按位取反:~a
  • 左移:a << n(右侧补 0)
  • 右移:a >> n(左侧补 0)
  • 复合赋值:&=, |=, ^=, <<=, >>=

五、注意事项

  1. 大小固定N 必须是编译期常量,不能用变量
  2. 下标方向:第 0 位是最右边(最低位),字符串最左对应最高位
  3. 越界行为operator[] 越界是未定义行为,test() 会抛异常
  4. 时间复杂度:单次位运算近似 O(N / 字长),比手动位运算快很多

六、典型应用场景

  • 状态压缩 DP(集合状态表示)
  • 埃氏筛法优化(素数筛)
  • 01 背包 bitset 优化
  • 位图标记、布尔集合运算