Problem 1D. 模拟bitset
Problem 1D. 模拟bitset
时间限制:1s
空间限制:256MB
题目描述
实现一个表示32位二进制位序列的类,初始使用一个无符号整数进行构造,支持七种操作:
- count- 查询二进制表示中值为\(1\) 的位的数量
- any- 查询二进制表示中是否存在值为 1 的位
- test pos- 查询二进制表示中位于- pos位置的值
- set pos- 将二进制表示中位于- pos位置的值设为 1
- reset pos- 将二进制表示中位于- pos位置的值设为 0
- flip 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;
}
信息
- ID
- 1495
- 难度
- 5
- 分类
- (无)
- 标签
- (无)
- 递交数
- 45
- 已通过
- 15
- 通过率
- 33%
- 上传者