18.5.12 c++选做题#4

4:自己实现bitset

描述程序

填空,实现一个类似STL bitset的 MyBitset, 输出指定结果

#include 
#include 
using namespace std;
template <int bitNum>
struct MyBitset 
{
    char a[bitNum/8+1];
    MyBitset() { memset(a,0,sizeof(a));};
    void Set(int i,int v) {
        char & c = a[i/8];
        int bp = i % 8;
        if( v ) 
            c |= (1 << bp);
        else 
            c &= ~(1 << bp);
    }
// 在此处补充你的代码
void Print() {
        for(int i = 0;i < bitNum; ++i) 
            cout << (*this) [i];
        cout << endl;
    }

};

int main()
{
    int n;
    int i,j,k,v;
    while( cin >>  n) {
        MyBitset<20> bs;
        for(int i = 0;i < n; ++i) {
            int t;
            cin >> t;
            bs.Set(t,1);
        }
        bs.Print();
        cin >> i >> j >> k >> v;
        bs[k] = v;
        bs[i] = bs[j] = bs[k];
        bs.Print();
        cin >> i >> j >> k >> v;
        bs[k] = v;
        (bs[i] = bs[j]) = bs[k];
        bs.Print();
    }
    return 0;
}

输入

多组数据
每组数据:
第一行是整数 n , 1 <= n < 20;
第二行是n个整数 k1,k2... kn,均在范围 [0,19]内。 
第三行是 四个整数 i1,j1,k1,v1 。 0 <= i1,j1,k1 <= 19, v1值为0或1
第三行是 四个整数 i2,j2,k2,v2 。 0 <= i2,j2,k2 <= 19, v2值为0或1

输出

对每组数据,共输出3行,每行20位,每位为1或者0。最左边称为第0位 
第一行: 第 k1,k2 ... kn位为1,其余位为0。 
第二行: 将第一行中的第 i1,j1,k1位变为 v1,其余位不变
第三行: 将第二行中的第i2位和k2位变为v2,其余位不变样例输入

4
0 1 2 8
7 19 0 1
7 2 8 0
1
1
1 1 1 0
1 1 1 1

样例输出

11100000100000000000
11100001100000000001
11100000000000000001
01000000000000000000
00000000000000000000
01000000000000000000

提示推荐使用内部类,内部类中使用引用成员。引用成员要在构造函数中初始化。

来源

Guo Wei

 1 #include 
 2 #include 
 3 using namespace std;
 4 template <int bitNum>
 5 struct MyBitset
 6 {
 7     char a[bitNum / 8 + 1];
 8     MyBitset() { memset(a, 0, sizeof(a)); };
 9     void Set(int i, int v) {
10         char & c = a[i / 8];
11         int bp = i % 8;
12         if (v)
13             c |= (1 << bp);
14         else
15             c &= ~(1 << bp);
16     }
17     // 在此处补充你的代码
18     class bsp {
19     public:
20         int hext[20], flag;
21         bsp() { flag = 0; 
22         memset(hext, 0, sizeof(int) * 20);
23         }
24         int&operator()(int x,MyBitset&k) {
25             if (!flag) {
26                 for (int i = 0; i <= bitNum / 8 + 1; i++) {
27                     int l = k.a[i]; int c = 8*i;
28                     while (l > 0) {
29                         if(l%2)
30                             hext[c]++;
31                         c++;
32                         l/= 2;
33                     }
34                 }
35                 flag = 1;
36             }
37             return hext[x];
38         }
39     };
40     bsp b;
41     int&operator[](int x) {
42         return b(x,*this);
43     }
44     //code ends
45     void Print() {
46         for (int i = 0; i < bitNum; ++i)
47             cout << (*this)[i];
48         cout << endl;
49     }
50 
51 };
52 
53 int main()
54 {
55     int n;
56     int i, j, k, v;
57     while (cin >> n) {
58         MyBitset<20> bs;
59         for (int i = 0; i < n; ++i) {
60             int t;
61             cin >> t;
62             bs.Set(t, 1);
63         }
64         bs.Print();
65         cin >> i >> j >> k >> v;
66         bs[k] = v;
67         bs[i] = bs[j] = bs[k];
68         bs.Print();
69         cin >> i >> j >> k >> v;
70         bs[k] = v;
71         (bs[i] = bs[j]) = bs[k];
72         bs.Print();
73     }
74     return 0;
75 }
View Code

被比赛突然结束所支配的恐惧……

(为什么还有限时啊我还以为起码会到考试之前都开的)

(至少开到12点啊我还能再抢救一下啊)

(没做完好不爽啊!!)

不管对不对先存在这吧 没准下次又开了呢(冷静分析)

转载于:https://www.cnblogs.com/yalphait/p/9030625.html

你可能感兴趣的:(18.5.12 c++选做题#4)