分类
Level4

bitset

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的函数