4:自己实现bitset
描述程序
填空,实现一个类似STL bitset的 MyBitset, 输出指定结果
#include <iostream> #include <cstring> 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 <iostream> 2 #include <cstring> 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 }
被比赛突然结束所支配的恐惧……
(为什么还有限时啊我还以为起码会到考试之前都开的)
(至少开到12点啊我还能再抢救一下啊)
(没做完好不爽啊!!)
不管对不对先存在这吧 没准下次又开了呢(冷静分析)
原文地址:https://www.cnblogs.com/yalphait/p/9030625.html
时间: 2024-10-29 02:48:31