跳转至

Bitset

bitset 存储二进制数位,其元素值只可能是 01truefalsebitsetbool 类型的数组类似,但是对空间做了优化。bitset 中的一个元素一般只占 1 bit,相比之下,在大多数语言系统中,最小的元素类型 char 需要 8bit。bitset 需要在编译时就确定其大小。如果需要不定长的 bitset,需要使用 vector<bool>

简单使用

// 从字符串初始化
bitset<8> bs1(string("1001"));
// 从字符串初始化,自定义 0/1 字符
string alpha_bit_string = "aBaaBBaB";
bitset<8> b6(alpha_bit_string, 0, alpha_bit_string.size(),  'a', 'B'); // [0,1,0,0,1,1,0,1]
// 从字符串的指定位置和长度初始化
string bit_string = "110010";
bitset<8> b5(bit_string, 2, 3); // [0,0,0,0,0,0,0,1]
// 从数字初始化
bitset<16> bs2(0xD9A1);
bitset<4> bs2(0x1101);

// 可以把 bitset 当作一个整型,可以进行与(&)、或(|)、异或(^)、左移(<<)、右移(>>)、按位取反(~)等操作
bitset<4> foo (string("1001"));
bitset<4> bar (string("0011"));
cout << (foo^=bar) << endl;       // 1010 (XOR,assign)
cout << (foo&=bar) << endl;       // 0010 (AND,assign)
cout << (foo|=bar) << endl;       // 0011 (OR,assign)
cout << (foo<<=2) << endl;        // 1100 (SHL,assign)
cout << (foo>>=1) << endl;        // 0110 (SHR,assign)
cout << (~bar) << endl;           // 1100 (NOT)
cout << (bar<<1) << endl;         // 0110 (SHL)
cout << (bar>>1) << endl;         // 0001 (SHR)
cout << (foo==bar) << endl;       // false (0110==0011)
cout << (foo!=bar) << endl;       // true  (0110!=0011)
cout << (foo&bar) << endl;        // 0010
cout << (foo|bar) << endl;        // 0111
cout << (foo^bar) << endl;        // 0101

常用的容器方法

  • foo.size() 返回位数
  • foo.count() 返回 1 的个数
  • foo.any() 返回是否有 1
  • foo.none() 返回是否没有 1
  • foo.set() 全都变成 1
  • foo.set(p) 将第 p + 1 位变成 1
  • foo.set(p, x) 将第 p + 1 位变成 x
  • foo.reset() 全都变成0
  • foo.reset(p) 将第 p + 1 位变成 0
  • foo.flip() 全都取反
  • foo.flip(p) 将第 p + 1 位取反
  • foo.to_ulong() 返回它转换为 unsigned long 的结果,如果超出范围则报错
  • foo.to_ullong() 返回它转换为 unsigned long long 的结果,如果超出范围则报错
  • foo.to_string() 返回它转换为 string 的结果