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 ),则计数器
