将整型运算对象当作二进制位集合处理。

初始化

  1. #include<bitset>
  2. bitset<n> b; // b有n位;每一位均为0。此构造函数是一个constexpr
  3. bitset<n> b(u); // u的低n位的拷贝,u的类型unsigned long long
  4. // 如果n>unsignedlonglong的大小,
  5. // 则b中超出unsignedlonglong的高位被置为0。
  6. // 此构造函数是一个constexpr
  7. bitset<n> b(str, pos=0, m=string::npos, zero='0', one='1')
  8. // b是str从位置pos开始m个字符的拷贝。str只能包含zero或one,
  9. // 如果str包含任何其他字符,构造函数会抛出invalid_argument异常。
  10. // 字符在b中分别保存为0和1。
  11. bitset<n> b(cp, pos, m, zero='0', one='1');
  12. // 同上,const char*版。如果未提供m,则cp必须指向一个C风格字符串。
  13. // 如果提供了m,则从cp开始必须至少有m个zero或one字符

例子:

  1. // bitvec1比初始值小;初始值中的高位被丢弃
  2. bitset<13> bitvec1(0xbeef); // 二进制位序列为1111011101111
  3. // bitvec2比初始值大;它的高位被置为0
  4. bitset<20> bitvec2(0xbeef); // 二进制位序列为00001011111011101111
  5. // 在64位机器中,0ULL是64个0bit,因此~OULL是64个1
  6. bitset<128> bitvec3(~0ULL); // 0~63位为1;63~127位为0
  7. // string的0下标是位的最高位。
  8. bitset<32> bitvec4("1100"); // 28个0 + 1100
  9. string str("1111111000000011001101");
  10. bitset<32> bitvec5(str, 5, 4); // 从str[5]开始的四个二进制位,1100
  11. bitset<32> bitvec6(str, str.size() - 4) ; // 使用最后四个宇符,1101

下图是上面最后三行代码的解释。关于string的下标是bitset的位位置的关系。
image.png

支持的操作

  1. b.any(); // b中是否存在置位的二进制位
  2. b.all(); // b中所有位都置位了吗
  3. b.none(); // b中不存在置位的二进制位吗
  4. b.count(); // b中置位的位数
  5. b.size(); // 返回b中的位数,constexpr函数
  6. b.test(pos); // 若pos位置的位是置位的,则返回true,否则返回false
  7. b.set(pos,v); // 将位置pos处的位设置为bool值v。v默认为true。如果
  8. b.set(); // 未传递实参,则将b中所有位置位
  9. b.reset(pos); // 位置pos处的位复位
  10. b.reset(); // 所有位复位
  11. b.flip(pos); // 改变位置pos处的位的状态
  12. b.flip(); // 改变b中每一位的状态
  13. b[pos]; // 访问b中位置pos处的位;返回bool
  14. // 如果b是const的,b[pos]置位返回true,否则返回false
  15. b.to_ulong(); // 返回一个unsignedlong或一个unsignedlonglong值,
  16. b.to_ullong(); // 返回一个unsignedlonglong值
  17. // 其位模式与b相同。如果b中位模式不能放入指定的结果类型,
  18. // 则抛出一个overflow_error异常
  19. b.to_string(zero, one); //返回一个string,表示b中的位模式。zero和one的默认值分别为0和1,
  20. //用来表示b中的0和1
  21. os << b; // 将b中二进制位打印为字符1或0,打印到os流
  22. is >> b; // 从is读取字符存入b。当下一个字符不是1或0时,
  23. // 或是已经读入b.size()个位时,读取过程停止
  1. bitset<32> bitvec(1U); // 32位:低位为1,剩余位为0
  2. boolis_set = bitvec.any(); // true,因为有1位置位
  3. boolis_not_set = bitvec.none(); // false,因为有1位置位了
  4. boolall_set = bitvec.all(); // false,因为只有1位置位
  5. size_t onBits = bitvec.count(); // 返回1
  6. size_t sz = bitvec.size(); // 返回32
  7. bitvec.flip(); // 翻转bitvec中的所有位
  8. bitvec.reset(); // 将所有位复位
  9. bitvec.set(); // 将所有位置位
  10. bitvec.flip(0); // 翻转笫一位
  11. bitvec.set(bitvec.size() - 1); // 置位最后一位
  12. bitvec.set(0,0); // 复位第一位
  13. bitvec.reset(i); // 复位第i位
  14. bitvec.test(0); // 返回false,因为笫一位是复位的
  15. bitvec[0] = 0; // 将第一位复位
  16. bitvec[31] = bitvec[0]; // 将最后一位设置为与第一位一样
  17. bitvec[0].flip(); // 翻转笫一位
  18. ~bitvec[0]; // 等价操作,也是翻转笫一位
  19. bool b = bitvec[0]; // 将bitvec[0]的值转换为bool类型
  20. //不能放入给定类型中,则这两个操作会抛出一个overflow_error 异常
  21. unsigned long ulong = bitvec.to_ulong();
  22. bitset<16> bits;
  23. cin >> bits; //从cin读取最多16个0或1