bitset
bitset
的基本用法
定义
bitset
的大小在定义时必须指定,通常是一个常量或编译时常量。例如:
const int MAXN = 64; // 定义最大位数
bitset<MAXN> bits;
常用方法
-
构造函数:
bitset<size>(value)
:用一个整数值初始化bitset
。bitset<size>(string)
:用一个二进制字符串初始化bitset
。
-
位操作:
bits[i]
:访问第 ( i ) 位的值(0 或 1)。bits.set(i)
:将第 ( i ) 位设置为1。bits.reset(i)
:将第 ( i ) 位设置为0。bits.flip(i)
:翻转第 ( i ) 位的值(0 变 1,1 变 0)。bits.test(i)
:检查第 ( i ) 位是否为1。
-
统计方法:
bits.count()
:返回bitset
中1的个数。bits.size()
:返回bitset
的大小(位数)。bits.any()
:检查bitset
中是否有任何一位为1。bits.none()
:检查bitset
中是否所有位都为0。bits.all()
:检查bitset
中是否所有位都为1。
-
转换方法:
bits.to_string()
:将bitset
转换为二进制字符串。bits.to_ulong()
:将bitset
转换为unsigned long
类型的整数。bits.to_ullong()
:将bitset
转换为unsigned long long
类型的整数。
在斑马值问题中的应用
在斑马值问题中,我们需要计算一个数的二进制表示中1的个数。bitset
的 count
方法可以高效地完成这个任务。
示例代码
#include <iostream>
#include <bitset>
using namespace std;const int MAXN = 64; // 最大二进制位数ll countZebraValue(ll l, ll r, ll k) {ll count = 0;for (ll x = l; x <= r; ++x) {bitset<MAXN> bits(x); // 将 x 转换为 bitsetif (bits.count() == k) { // 计算二进制表示中1的个数count++;}}return count;
}int main() {int t;cin >> t;while (t--) {ll l, r, k;cin >> l >> r >> k;cout << countZebraValue(l, r, k) << endl;}return 0;
}
代码解释
-
定义
bitset
:- 使用
bitset<MAXN>
定义一个大小为MAXN
的bitset
,MAXN
是一个常量,表示最大二进制位数。
- 使用
-
计算1的个数:
- 使用
bitset<MAXN> bits(x)
将整数 ( x ) 转换为bitset
。 - 使用
bits.count()
方法计算 ( x ) 的二进制表示中1的个数。
- 使用
-
统计满足条件的数:
- 遍历区间 ([l, r]) 内的每个数 ( x ),如果 ( x ) 的二进制表示中1的个数等于 ( k ),则计数器
count
加1。
- 遍历区间 ([l, r]) 内的每个数 ( x ),如果 ( x ) 的二进制表示中1的个数等于 ( k ),则计数器