#4. Problem 1D. 模拟bitset

Problem 1D. 模拟bitset

Problem 1D. 模拟bitset

时间限制:1s

空间限制:256MB

题目描述

实现一个表示32位二进制位序列的类,初始使用一个无符号整数进行构造,支持七种操作:

  1. count - 查询二进制表示中值为11 的位的数量
  2. any - 查询二进制表示中是否存在值为 1 的位
  3. test pos - 查询二进制表示中位于 pos 位置的值
  4. set pos - 将二进制表示中位于 pos 位置的值设为 1
  5. reset pos - 将二进制表示中位于 pos 位置的值设为 0
  6. flip pos - 将二进制表示中位于 pos 位置的值取反
  7. to_ulong - 查询该二进制表示转化为无符号整数的值

现在使用一个无符号整数 xx 构造一个该类的对象,并对此对象进行 MM 个操作,其中的每个操作 11 , 操作 22, 操作 33 和操作77 都要输出相应的结果。

输入格式

第一行包含无符号整数 xx 和整数 MM,含义见描述。

接下来 MM 行,每行包含一个操作命令,操作命令为 countanytest posset posreset posflip posto_ulong中的一种。

输出格式

对于每个 countanytest posto_ulong操作都要输出一个查询结果,每个结果占一行。

其中,count 操作的查询结果为一个整数,表示二进制表示中值为11 的位的数量;any操作的查询结果为 YESNOtest pos操作的查询结果为 0011to_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

数据范围

对于 100%100\% 的数据:

0x23210 \le x \le 2^{32}-1

1M100001 \le M \le 10000

0pos<320 \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;
}