Problem 1D. 模拟bitset

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

Problem 1D. 模拟bitset

时间限制:1s

空间限制:256MB

题目描述

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

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

现在使用一个无符号整数 \(x\) 构造一个该类的对象,并对此对象进行 \(M\) 个操作,其中的每个操作 \(1\) , 操作 \(2\), 操作 \(3\) 和操作\(7\) 都要输出相应的结果。

输入格式

第一行包含无符号整数 \(x\) 和整数 \(M\),含义见描述。

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

输出格式

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

其中,count 操作的查询结果为一个整数,表示二进制表示中值为\(1\) 的位的数量;any操作的查询结果为 YESNOtest 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;
}

2023秋 悬赏令第一周

未参加
状态
已结束
规则
OI
题目
6
开始于
2023-10-01 18:30
结束于
2023-10-08 00:00
持续时间
149.5 小时
主持人
参赛人数
101