Problem 1D. 模拟bitset
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
Problem 1D. 模拟bitset
时间限制:1s
空间限制:256MB
题目描述
实现一个表示32位二进制位序列的类,初始使用一个无符号整数进行构造,支持七种操作:
count
- 查询二进制表示中值为\(1\) 的位的数量any
- 查询二进制表示中是否存在值为 1 的位test pos
- 查询二进制表示中位于pos
位置的值set pos
- 将二进制表示中位于pos
位置的值设为 1reset pos
- 将二进制表示中位于pos
位置的值设为 0flip pos
- 将二进制表示中位于pos
位置的值取反to_ulong
- 查询该二进制表示转化为无符号整数的值
现在使用一个无符号整数 \(x\) 构造一个该类的对象,并对此对象进行 \(M\) 个操作,其中的每个操作 \(1\) , 操作 \(2\), 操作 \(3\) 和操作\(7\) 都要输出相应的结果。
输入格式
第一行包含无符号整数 \(x\) 和整数 \(M\),含义见描述。
接下来 \(M\) 行,每行包含一个操作命令,操作命令为 count
,any
,test pos
,set pos
,reset pos
,flip pos
,to_ulong
中的一种。
输出格式
对于每个 count
,any
, test pos
和to_ulong
操作都要输出一个查询结果,每个结果占一行。
其中,count
操作的查询结果为一个整数,表示二进制表示中值为\(1\) 的位的数量;any
操作的查询结果为 YES
或 NO
;test pos
操作的查询结果为 \(0\) 或 \(1\) ;to_ulong
操作的查询结果为一个32位无符号整数。
样例
输入
31 10
count
reset 0
test 0
test 1
set 5
to_ulong
flip 2
any
set 31
to_ulong
输出
5
0
1
62
YES
2147483706
样例解释
初始化一个32位的二进制位序列,表示为:0000 0000 0000 0000 0000 0000 0001 1111,由于初始值是31,只有最后五位为1。
接下来,执行操作:
1.count
- 查询二进制表示中值为1的位的数量,结果是5。
2.reset 0
- 将第0位的值设为0,变成:0000 0000 0000 0000 0000 0000 0001 1110
。
3.test 0
- 查询第0位的值,结果是0。
4.test 1
- 查询第1位的值,结果是1。
5.set 5
- 将第5位的值设为1,变成:0000 0000 0000 0000 0000 0000 0011 1110
。
6.to_ulong
- 查询二进制表示转化为无符号整数的值,结果是62。
7.flip 2
- 将第2位的值取反,变成:0000 0000 0000 0000 0000 0000 0011 1010
。
8.any
- 查询是否存在值为1的位,结果是YES。
9.set 31
- 将第31位的值设为1,变成:1000 0000 0000 0000 0000 0000 0011 1010
。
10.to_ulong
- 查询二进制表示转化为无符号整数的值,结果是2147483706。
数据范围
对于 \(100\%\) 的数据:
\(0 \le x \le 2^{32}-1\)
\(1 \le M \le 10000\)
\(0 \le pos < 32\)
所有操作保证合法。
提示
可以使用以下C++的代码模板,只需要补充成员函数的内容即可:
// 学号姓名
#include <bits/stdc++.h>
using namespace std;
class BitSet
{
public:
BitSet(unsigned x)
{
}
int count()
{
return 0;
}
bool any()
{
return false;
}
int test(int pos)
{
return 0;
}
void set(int pos)
{
}
void reset(int pos)
{
}
void flip(int pos)
{
}
unsigned to_ulong()
{
return 0;
}
};
int main()
{
unsigned x;
int m;
cin >> x >> m;
BitSet b(x);
while(m--)
{
string op; cin >> op;
if(op == "count") cout << b.count() << endl;
else if(op == "any") cout << (b.any()?"YES":"NO") << endl;
else if(op == "test")
{
int pos; cin >> pos;
cout << b.test(pos) << endl;
}
else if(op == "set")
{
int pos; cin >> pos;
b.set(pos);
}
else if(op == "reset")
{
int pos; cin >> pos;
b.reset(pos);
}
else if(op == "flip")
{
int pos; cin >> pos;
b.flip(pos);
}
else cout << b.to_ulong() << endl;
}
return 0;
}