分类
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;//无参构造,长度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
}