C++ 中std::bitset的使用总结

背景

在项目实践过程中某个功能通常需要维护一系列的状态标志(0 或者 1),若设置多个 bool 参数来保存一组状态会比较繁琐,此时可以使用二进制位来表示一组状态。

std::bitset

bitset是 C++中的一个类库,来管理一系列bit位,类似于数组,但每个元素只能是 0 或 1 且仅用 1 bit 的空间,包含于头文件#include < bitset > 中。

基本使用

①.构造方法

bitset<4> bitset1;  //无参构造,长度为4,默认每一位为0
bitset<8> bitset2(12); //长度为8,二进制保存,前面用0补充

string s = "100101";
bitset<10> bitset3(s);  //长度为10,前面用0补充
    
char s2[] = "10101";
bitset<13> bitset4(s2);  //长度为13,前面用0补充

cout << bitset1 << endl;  //0000
cout << bitset2 << endl;  //00001100
cout << bitset3 << endl;  //0000100101
cout << bitset4 << endl;  //0000000010101

②.数据访问

bitset<4> foo ("1011");
cout << foo[0] << endl;//1,下标从 0 开始,表示二进制的最低位

③.数据操作

bitset<4> foo ("1011");
foo[i] = 0;//给第 i 位赋值

foo.flip();//反转全部
foo.flip(i);//反转下标为 i 的位

foo.set();//全部置1
foo.set(i);//第 i 位置 1
foo.set(i,0);//第 i 位置 0

foo.reset();//全部置 0
foo.reset(i);//第 i 位置 0

④.数据转换

bitset<8> foo ("10011011");

string s = foo.to_string();  //将bitset转换成string类型
unsigned long a = foo.to_ulong();  //将bitset转换成unsigned long类型
unsigned long long b = foo.to_ullong();  //将bitset转换成unsigned long long类型

⑤.位操作符

bitset<4> foo (string("1001"));
bitset<4> bar (string("0011"));

cout << (foo^=bar) << endl;       // 1010 (foo对bar按位异或后赋值给foo)
cout << (foo&=bar) << endl;       // 0010 (按位与后赋值给foo)
cout << (foo|=bar) << endl;       // 0011 (按位或后赋值给foo)

cout << (foo<<=2) << endl;        // 1100 (左移2位,低位补0,有自身赋值)
cout << (foo>>=1) << endl;        // 0110 (右移1位,高位补0,有自身赋值)

cout << (~bar) << endl;           // 1100 (按位取反)
cout << (bar<<1) << endl;         // 0110 (左移,不赋值)
cout << (bar>>1) << endl;         // 0001 (右移,不赋值)

cout << (foo==bar) << endl;       // false (0110==0011为false)
cout << (foo!=bar) << endl;       // true  (0110!=0011为true)

cout << (foo&bar) << endl;        // 0010 (按位与,不赋值)
cout << (foo|bar) << endl;        // 0111 (按位或,不赋值)
cout << (foo^bar) << endl;        // 0101 (按位异或,不赋值)

⑥.可用函数

bitset<8> foo ("10011011");

cout << foo.count() << endl;  //5  (count函数用来求bitset中1的位数,foo中共有5个1
cout << foo.size() << endl;   //8  (size函数用来求bitset的大小,一共有8位

cout << foo.test(0) << endl;  //true  (test函数用来查下标处的元素是0还是1,并返回false或true,此处foo[0]为1,返回true
cout << foo.test(2) << endl;  //false  (同理,foo[2]为0,返回false

cout << foo.any() << endl;  //true  (any函数检查bitset中是否有1
cout << foo.none() << endl;  //false  (none函数检查bitset中是否没有1
cout << foo.all() << endl;  //false  (all函数检查bitset中是全部为1

C++ 中std::bitset的使用总结_第1张图片

你可能感兴趣的:(c++,算法与数据结构,c++,开发语言,后端)