bitset 在 bitset 头文件中,它类似数组,并且每一个元素只能是0或1,每个元素只用1bit空间。
一、初始化方法
bitset<n> a //a有n位,每位都为0
bitset<n> a(b) //a是unsigned long型u的一个副本
bitset<n> a(s) //a是string对象s中含有的位串的副本
bitset<n> a(s,pos,n) //a是s中从位置pos开始的n个位的副本
#include<iostream>
#include<bitset>
using namespace std;
int main(){
bitset<4> b1;//无参构造,长度4,默认每一位为0
bitset<9> b2(12);//长度9,将12转为2进制,前面用0补
// 或此写法 bitset<9> b2({12});
string s="100101";//有参构造:string字符串作为参数
bitset<10> b3(s);//长度10,前面用 0 补充
char s2[] = "10101";//有参构造:字符数组作为参数
bitset<13> b4(s2); //长度13,前面用 0 补充
cout<<b1<<endl; //0000
cout<<b2<<endl; //000001100
cout<<b3<<endl; //0000100101
cout<<b4<<endl; //0000000010101
return 0;
}
二、bitset可以进行位操作
#include<iostream>
#include<bitset>
using namespace std;
int main(){
bitset<4> a(string("1001"));
bitset<4> b(string("0011"));
cout<<(a^=b)<<endl;//1010 (a对b按位异或后赋值给foo)
cout<<(a&=b)<<endl;//0010 (按位与后赋值给a)
cout<<(a|=b)<<endl;//0011 (按位或后赋值给a)
cout<<(a<<=2)<<endl;//1100 (左移2位,低位补0,有自身赋值)
cout<<(a>>=1)<<endl;//0110 (右移1位,高位补0,有自身赋值)
cout<<(~b)<<endl; //1100 (按位取反)
cout<<(b<<1)<<endl;//0110 (左移,不赋值)
cout<<(b>>1)<<endl;//0001 (右移,不赋值)
cout<<(a==b)<<endl;//0 false (1001==0011为false)
cout<<(a!=b)<<endl;//1 true (1001!=0011为true)
cout<<(a&b)<<endl;//0010 (按位与,不赋值)
cout<<(a|b)<<endl;//0111 (按位或,不赋值)
cout<<(a^b)<<endl;//0101 (按位异或,不赋值)
return 0;
}
三、bitset的遍历
可以通过 [] 访问元素(类似数组),注意最低位下标为0,类似于数的二进制表示。注意: bitset遍历访问时候是从右边(最低位)开始访问的,但是左右移位的时候还是按照原来的形式左右移位的。
#include<iostream>
#include<bitset>
using namespace std;
int main(){
bitset<6> b("101111");
for(int i=0;i<6;++i){ //输出111101
cout<<b[i];
}
return 0;
}
四、bitset的函数
#include<iostream>
#include<bitset>
using namespace std;
int main(){
bitset<4> a(string("1001"));
cout<<a.size()<<endl; //4:2进制位数是4
cout<<a.count()<<endl; //2:a里面有2个1
cout<<a.to_ulong()<<endl; //9:a的unsigned long的值为9
return 0;//注意:to_ulong最多允许32位二进制数,否则err
}