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; //1. 无参构造,长度4,默认每一位为0
bitset<9> b2(12);//2. 长度9,将12转化为2进制保存,前面用0补
// 或此写法 bitset<9> b2({12});
//3. 有参构造:string字符串作为参数
string s="100101";
bitset<10> b3(s); //长度10,前面用 0 补充
//4. 有参构造:char字符数组(字符串)作为参数
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> foo(string("1001"));
bitset<4> bar(string("0011"));
cout<<(foo ^= bar)<<endl;//1010 (foo对bar按位异或后赋值给foo)
cout<<(foo &= bar)<<endl;//0001 (按位与后赋值给foo)
cout<<(foo |= bar)<<endl;//1011 (按位或后赋值给foo)
cout<<(foo <<= 2)<<endl;//0100 (左移2位,低位补0,有自身赋值)
cout<<(foo >>= 1)<<endl;//0100 (右移1位,高位补0,有自身赋值)
cout<<(~bar)<<endl; //1100 (按位取反)
cout<<(bar << 1)<<endl;//0110 (左移,不赋值)
cout<<(bar >> 1)<<endl;//0001 (右移,不赋值)
cout<<(foo == bar)<<endl;//false (1001==0011为false)
cout<<(foo != bar)<<endl;//true (1001!=0011为true)
cout<<(foo & bar)<<endl;//0001 (按位与,不赋值)
cout<<(foo | bar)<<endl;//1011 (按位或,不赋值)
cout<<(foo ^ bar)<<endl;//1010 (按位异或,不赋值)
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的函数