• [Aizu] ITP2_10_C~D: bit flag and bit mask


    前言

    ITP系列之位运算, 具体内容参见bitset

    题目链接

    ITP2_10_C: Bit Flag
    ITP2_10_D: Bit Mask

    求解

    第一题

    明确的指定了让处理哪一位, 很容易就用bitset类搞定了

    #include <bits/stdc++.h>
    using namespace std;
     
    int main(void) {
        ios::sync_with_stdio(false);
        cin.tie(0);
     
        int q, com, i;
        bitset<64> bs;
        bs.reset();
     
        cin >> q;
        while (q--) {
            cin >> com;
            switch (com) {
                case 0:
                    cin >> i;
                    cout << bs.test(i) << endl;
                    break;
                case 1:
                    cin >> i;
                    bs.set(i);
                    break;
                case 2:
                    cin >> i;
                    bs.reset(i);
                    break;
                case 3:
                    cin >> i;
                    bs.flip(i);
                    break;
                case 4:
                    cout << (bs.all() ? 1 : 0) << endl;
                    break;
                case 5:
                    cout << (bs.any() ? 1 : 0) << endl;
                    break;
                case 6:
                    cout << (bs.none() ? 1 : 0) << endl;
                    break;
                case 7:
                    cout << bs.count() << endl;
                    break;
                case 8:
                    cout << bs.to_ulong() << endl;
            }
        }
    }
    

    第二题

    题目中说明了, 不再是给定一位进行处理, 而是给定一部分(掩码), 然后每次都要对这一部分进行对应的处理, 我第一次尝试的时候是通过创建一个嵌套的vector容器来存储那些特殊值的, 在看了别人的代码后, 才尝试着去使用bitset作为数组元素来用.

    第一次代码

    #include <bits/stdc++.h>
    using namespace std;
     
    int main(void) {
        ios::sync_with_stdio(false);
        cin.tie(0);
     
        vector<vector<int> > vec;
        vector<int> ve;
        vector<int>::iterator it;
        bitset<64> bs;
        int n, q, com, i, k;
        int flag, cnt;
        unsigned long val;
     
        cin >> n;
        while (n--) {
            ve.clear();
            cin >> k;
            while (k--) {
                cin >> i;
                ve.push_back(i);
            }
            vec.push_back(ve);
        }
     
        cin >> q;
        while (q--) {
            cin >> com >> i;
            switch (com) {
                case 0:
                    cout << bs.test(i) << endl;
                    break;
                case 1:
                    ve = vec[i];
                    for (it = ve.begin(); it != ve.end(); it++) {
                        bs.set(*it);
                    }
                    break;
                case 2:
                    ve = vec[i];
                    for (it = ve.begin(); it != ve.end(); it++) {
                        bs.reset(*it);
                    }
                    break;
                case 3:
                    ve = vec[i];
                    for (it = ve.begin(); it != ve.end(); it++) {
                        bs.flip(*it);
                    }
                    break;
                case 4:
                    ve = vec[i];
                    flag = 1;
                    for (it = ve.begin(); flag && it != ve.end(); it++) {
                        flag = bs.test(*it);
                    }
                    cout << flag << endl;
                    break;
                case 5:
                    ve = vec[i];
                    flag = 0;
                    for (it = ve.begin(); flag == 0 && it != ve.end(); it++) {
                        flag = bs.test(*it);
                    }
                    cout << flag << endl;
                    break;
                case 6:
                    ve = vec[i];
                    flag = 0;
                    for (it = ve.begin(); flag == 0 && it != ve.end(); it++) {
                        flag = bs.test(*it);
                    }
                    if (flag) cout << 0 << endl;
                    else cout << 1 << endl;
                    break;
                case 7:
                    ve = vec[i];
                    cnt = 0;
                    for (it = ve.begin(); it != ve.end(); it++) {
                        cnt += bs.test(*it);
                    }
                    cout << cnt << endl;
                    break;
                case 8:
                    ve = vec[i];
                    val = 0;
                    for (it = ve.begin(); it != ve.end(); it++) {
                        val += ((unsigned long)bs.test(*it)) << *it;
                    }
                    cout << val << endl;
            }
        }
    }
    

    第二次学习别人风格的代码

    #include <bits/stdc++.h>
    using namespace std;
     
    int main(void) {
        ios::sync_with_stdio(false);
        cin.tie(0);
     
        vector<bitset<64> > v(10);
        bitset<64> bs;
     
        int n, q, k, com, i;
     
        cin >> n;
        for (int j = 0; j < n; j++) {
            cin >> k;
            while (k--) {
                cin >> i;
                v[j][i] = 1;
            }
        }
     
        cin >> q;
        while (q--) {
            cin >> com >> i;
            if (com == 0) cout << bs.test(i) << endl;
            if (com == 1) bs |= v[i];
            if (com == 2) bs &= ~v[i];
            if (com == 3) bs ^= v[i];
            if (com == 4) cout << ((bs & v[i]) == v[i]) << endl;
            if (com == 5) cout << ((bs & v[i]).to_ulong() != 0) << endl;
            if (com == 6) cout << ((bs & v[i]).to_ulong() == 0) << endl;
            if (com == 7) cout << (bs & v[i]).count() << endl;
            if (com == 8) cout << (bs & v[i]).to_ulong() << endl;
        }
    }
    
  • 相关阅读:
    安卓自己定义View进阶-Canvas之绘制基本形状
    IOS UIPickView+sqlite 选择中国全部城市案例
    linux的主分区与逻辑分区的关系
    Qt:解析命令行
    Firefox默认英文修改中文
    autofs自动挂载
    telent对端口检测状态分析
    WinRAR5.4
    Centos6.5入侵清理
    Win10激活KMS
  • 原文地址:https://www.cnblogs.com/by-sknight/p/11025245.html
Copyright © 2020-2023  润新知