我是蒟蒻一名,请大佬勿喷。
绝大部分来自https://www.cnblogs.com/magisk/p/8809922.html , 可以去大佬博客逛一逛
bitset是C++中类似数组的一种结构,但是因为每位只能是0或1,对于某些明显的二进制题目来说,如果你不会压位的话,bitsei确实为一个很好的选择。
bitset有4个构造函数。
1 #include <iostream> 2 #include<bitset> 3 using namespace std; 4 int main() 5 { 6 bitset<10> a("10");//此处不能出现除了0 1之外的字符,否则将会抛出异常 7 bitset<10> b(10);//二进制 8 bitset<10> c;//无参构造函数,初始化为0 9 bitset<10> d(a);//拷贝构造函数 10 cout<<a<<endl; 11 cout<<b<<endl; 12 cout<<c<<endl; 13 cout<<d<<endl; 14 //使用bitset解题时,注意他如果要输出最后二进制答案,一定要反过来 15 return 0; 16 }
若bitset位数大于操作数,前面用零补充
bitset中有的操作符
1 #include <iostream> 2 #include<bitset> 3 using namespace std; 4 int main() 5 { 6 bitset<10> a("10");//此处不能出现除了0 1之外的字符,否则将会抛出异常 7 bitset<10> b(10);//二进制 8 bitset<10> c;//无参构造函数,初始化为0 9 bitset<10> d(a);//拷贝构造函数 10 11 cout<<(a&b)<<endl;//按位与,整型数也是二进制存在计算机里面的,bitset当然也可以 12 //意思就是整型有的位运算,bitset全都有 13 //不过要记住的是要打括号 14 cout<<(a|b)<<endl; 15 cout<<(a^b)<<endl; 16 cout<<(a>>1)<<endl; 17 cout<<(a<<1)<<endl; 18 //前面说bitset类似于数组,那么肯定可以通过下标访问元素的 19 a[0]=1; 20 cout<<a<<endl;//结果为0000000011 21 //还是那个注意点,反的 22 //结合int的值就很好理解了 23 return 0; 24 }
如果题目要求输出不带前导零的二进制答案,那么
#include <iostream> #include<bitset> using namespace std; int main() { bitset<10> a("10");//此处不能出现除了0 1之外的字符,否则将会抛出异常 int w=-1; for(int i=a.size();i>=0;i--) { if(a[i]) { w=i; break; } } for(int i=w;i>=0;i--) { cout<<a[i]; } return 0; }
虽然下面会讲bitset的函数可以完成同样的功能,但是蒟蒻的我觉得应该效率和循环应该差不太多
bitset中的函数
1 #include <iostream> 2 #include<bitset> 3 using namespace std; 4 int main() 5 { 6 bitset<10> a("100010"); 7 cout<<a.count()<<endl;//返回bitset中1的个数 8 cout<<a.test(1)<<endl;//相当于数组式的访问,但是会有下标检查 9 cout<<a.size()<<endl;//返回大小,是最开始定义的大小 10 cout<<a.any()<<endl;//返回bitset中是否有1 11 cout<<a.none()<<endl;//返回bitset中是否没有1 12 cout<<a.all()<<endl;//返回是否全为1 13 14 15 bitset<10> b("1111011"); 16 cout<<b.flip()<<endl;//取反,若给参数,则将参数位取反 17 cout<<b.set()<<endl;//置1 18 cout<<b.reset()<<endl;//清0 19 //以上全都可带参数,大概同flip 20 cout<<b.set(2,1)<<endl;//相当于b[2]=1; 21 22 23 bitset<10> c("1011011"); 24 string t1=c.to_string(); 25 unsigned t2=c.to_ulong(); 26 unsigned long long t3=c.to_ullong(); 27 cout<<t1<<endl;//1011011 28 cout<<t2<<endl;//91 29 cout<<t3<<endl;//91 30 return 0; 31 }