butset详解以及用法
bitset是C++ 标准库中的一个类,它提供了一种方便的方式来操作位序列,常用于位运算和状态压缩。下面我将为您详细介绍 bitset 的基本概念、基本用法以及一些常用的成员函数。
基本概念
1、bitset 可以看作是一个多位二进制数,其每一位都是 0 或 1。
2、它是一个固定大小的容器,可以存储指定数量的位。
3、由于 bitset 支持基本的位运算,因此它非常适合用于状态压缩和表示一组布尔值。
基本用法
定义
bitset<N> b; // 定义一个 N 位的 bitset,所有位初始化为 0
N是正整数表示bitset的大小
位运算操作符
1、~b:对 b 中的每一位取反。
2、b1 & b2、b1 | b2、b1 ^ b2:对两个位数相同的 bitset 执行按位与、或、异或运算。
3、b << n、b >> n:将 b 左移或右移 n 位(右侧或左侧补零)。
4、b1 == b2、b1 != b2:比较两个位数相同的 bitset 是否相等。
访问和修改位
b[k]:访问或修改 b 的第 k 位(从 0 开始计数)。
成员函数
1、b.count():返回 b 中设置为 1 的位数。
2、b.any():如果 b 中至少有一位为 1,则返回 true;否则返回 false。
3、b.none():如果 b 中的所有位都为 0,则返回 true;否则返回 false。
4、b.set():将 b 中的所有位设置为 1。
5、b.set(k, v):将 b 的第 k 位设置为 v(v 为 true 或 false)。
6、b.reset():将 b 中的所有位设置为 0。
7、b.reset(k):将 b 的第 k 位设置为 0。
8、b.flip():将 b 中的所有位取反。
9、b.flip(k):将 b 的第 k 位取反。
10、b.to_ulong()、b.to_ullong():将 bitset 转换为 unsigned long 或 unsigned long long 类型的整数(注意转换时的位数限制)。
类型转换
1、数字转换为 bitset:将数字转换为二进制,并存储在 bitset 中。如果数字的二进制位数小于 bitset 的大小,则在前面补零;如果大于 bitset 的大小,则只取最低的 N 位。
2、字符串转换为 bitset:字符串只能包含 0 和 1,否则会报错。
注意事项
1、bitset 的长度是固定的,在定义时需要指定。
2、bitset 适用于小规模的位运算和状态压缩,如果规模较大,可能需要考虑其他数据结构或方法。
3、bitset 底层是通过数组来实现的,每个元素占用 1 位空间,但每 8 位(一个字节)实际上会占用一个字节的存储空间。