bitset
一:bitset头文件
C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是 0 或 1,每个元素仅用 1bit 空间
注:在用字符串构造时,字符串中只能包含‘0’和‘1’;bitset下标从0开始,可以通过【】访问元素,类似数组
二:常用构造函数
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn = 1e5+10; 5 const int inf = 0x3f3f3f3f; 6 #define rep(i,first,second) for(ll i=first;i<=second;i++) 7 #define dep(i,first,second) for(ll i=first;i>=second;i--) 8 9 int main() 10 { 11 //1.bitset<len>b; 12 //无参构造,长度为len,默认每一位为0 13 bitset<4> bitset1; 14 15 //2.bitset<len>b(unsigned long n) 16 //长度为len,二进制保存n,若十进制化为二进制后位数不足len,前面用0补充 17 //若十进制化为二进制后位数超过len,则前面被截除 18 bitset<8> bitset2(12); 19 20 //3.bitset<len>(string s) 21 //长度为len,前面用0补充 22 string s="100101"; 23 bitset<10> bitset3(s); 24 25 //4.长度为9,前面用0补充 26 char ss[]="10101"; 27 bitset<9> bitset4(ss); 28 29 //5.bitset<len>b(string s,int pos) 30 //长度为len,从s的pos为开始往后截取s,前面的补0 31 string st="01011011"; 32 bitset<10>bitset5(st,1); 33 34 //6.bitset<len>b(string s,int pos,int num) 35 //从s的pos位开始取后面的num个,前面补0 36 string stt="01011011"; 37 bitset<10>bitset6(stt,2,4); 38 39 40 cout<<bitset1<<endl; 41 cout<<bitset2<<endl; 42 cout<<bitset3<<endl; 43 cout<<bitset4<<endl; 44 cout<<bitset5<<endl; 45 cout<<bitset6<<endl; 46 47 return 0; 48 }
三:可用操作符
1 #include <iostream> 2 #include <bitset> 3 #include <algorithm> 4 using namespace std; 5 6 int main() 7 { 8 string s1="1001"; 9 string s2="0011"; 10 bitset<4>foo (s1); 11 bitset<4>bar (s2); 12 13 cout<<(foo^=bar)<<'\n'; //按位异或,赋值给foo 14 cout<<(foo&=bar)<<'\n'; //按位与,赋值给foo 15 cout<<(foo|=bar)<<'\n'; //按位或,赋值给foo 16 17 cout<<(foo<<=1)<<'\n'; //左移1位,低位补0,自身赋值 18 cout<<(foo>>=1)<<'\n'; //右移1位,高位补0,自身赋值 19 20 cout<<(~bar)<<'\n'; //按位取反 21 cout<<(bar<<1)<<'\n'; //左移一位,不赋值 22 cout<<(bar>>1)<<'\n'; //右移一位,不赋值 23 24 cout<<(foo==bar)<<'\n'; //false,判foo与bar是否相等 25 cout<<(foo!=bar)<<'\n'; //true,判foo与bar是否不相等 26 27 28 return 0; 29 }
四.通过【】访问元素,类似数组,注意:最低位(右边是最低位)下标为 0
1 #include <iostream> 2 #include <bitset> 3 #include <algorithm> 4 using namespace std; 5 6 int main() 7 { 8 bitset<4> foo(8); 9 for(int i=3;i>=0;i--){ 10 cout<<foo[i]; 11 } 12 cout<<'\n'; 13 return 0; 14 }
五:其他函数
1 #include <iostream> 2 #include <bitset> 3 #include <algorithm> 4 using namespace std; 5 6 int main() 7 { 8 bitset<8> a("10011010"); 9 10 cout<<a.count()<<'\n'; //(count函数用来求bitset中1的位数) 11 cout<<a.size()<<'\n'; //(size函数用来求bitset的大小 12 13 cout<<a.test(0)<<'\n'; //(test函数用来查找下标处的元素是0还是1,若为0返回0,若为1返回1 14 cout<<a.test(7)<<'\n'; 15 16 cout<<a.any()<<'\n'; //(any函数检查bitset中是否有1) 17 cout<<a.none()<<'\n'; //(none函数检查bitset中是否没有1) 18 cout<<a.all()<<'\n'; //(all函数检查bitset中是否全部为1) 19 return 0; 20 }
六:类型转化函数:
1 #include <iostream> 2 #include <bitset> 3 #include <algorithm> 4 using namespace std; 5 6 int main() 7 { 8 bitset<8> a("10011100"); 9 string s=a.to_string(); 10 unsigned long x=a.to_ulong(); 11 unsigned long long y=a.to_ullong(); 12 13 cout<<s<<'\n'; 14 cout<<x<<'\n'; 15 cout<<y<<'\n'; 16 return 0; 17 }