初始化
#include<bitset>bitset<n> b; // b有n位;每一位均为0。此构造函数是一个constexprbitset<n> b(u); // u的低n位的拷贝,u的类型unsigned long long// 如果n>unsignedlonglong的大小,// 则b中超出unsignedlonglong的高位被置为0。// 此构造函数是一个constexprbitset<n> b(str, pos=0, m=string::npos, zero='0', one='1')// b是str从位置pos开始m个字符的拷贝。str只能包含zero或one,// 如果str包含任何其他字符,构造函数会抛出invalid_argument异常。// 字符在b中分别保存为0和1。bitset<n> b(cp, pos, m, zero='0', one='1');// 同上,const char*版。如果未提供m,则cp必须指向一个C风格字符串。// 如果提供了m,则从cp开始必须至少有m个zero或one字符
例子:
// bitvec1比初始值小;初始值中的高位被丢弃bitset<13> bitvec1(0xbeef); // 二进制位序列为1111011101111// bitvec2比初始值大;它的高位被置为0bitset<20> bitvec2(0xbeef); // 二进制位序列为00001011111011101111// 在64位机器中,0ULL是64个0bit,因此~OULL是64个1bitset<128> bitvec3(~0ULL); // 0~63位为1;63~127位为0// string的0下标是位的最高位。bitset<32> bitvec4("1100"); // 28个0 + 1100string str("1111111000000011001101");bitset<32> bitvec5(str, 5, 4); // 从str[5]开始的四个二进制位,1100bitset<32> bitvec6(str, str.size() - 4) ; // 使用最后四个宇符,1101
下图是上面最后三行代码的解释。关于string的下标是bitset的位位置的关系。
支持的操作
b.any(); // b中是否存在置位的二进制位b.all(); // b中所有位都置位了吗b.none(); // b中不存在置位的二进制位吗b.count(); // b中置位的位数b.size(); // 返回b中的位数,constexpr函数b.test(pos); // 若pos位置的位是置位的,则返回true,否则返回falseb.set(pos,v); // 将位置pos处的位设置为bool值v。v默认为true。如果b.set(); // 未传递实参,则将b中所有位置位b.reset(pos); // 位置pos处的位复位b.reset(); // 所有位复位b.flip(pos); // 改变位置pos处的位的状态b.flip(); // 改变b中每一位的状态b[pos]; // 访问b中位置pos处的位;返回bool// 如果b是const的,b[pos]置位返回true,否则返回falseb.to_ulong(); // 返回一个unsignedlong或一个unsignedlonglong值,b.to_ullong(); // 返回一个unsignedlonglong值// 其位模式与b相同。如果b中位模式不能放入指定的结果类型,// 则抛出一个overflow_error异常b.to_string(zero, one); //返回一个string,表示b中的位模式。zero和one的默认值分别为0和1,//用来表示b中的0和1os << b; // 将b中二进制位打印为字符1或0,打印到os流is >> b; // 从is读取字符存入b。当下一个字符不是1或0时,// 或是已经读入b.size()个位时,读取过程停止
bitset<32> bitvec(1U); // 32位:低位为1,剩余位为0boolis_set = bitvec.any(); // true,因为有1位置位boolis_not_set = bitvec.none(); // false,因为有1位置位了boolall_set = bitvec.all(); // false,因为只有1位置位size_t onBits = bitvec.count(); // 返回1size_t sz = bitvec.size(); // 返回32bitvec.flip(); // 翻转bitvec中的所有位bitvec.reset(); // 将所有位复位bitvec.set(); // 将所有位置位bitvec.flip(0); // 翻转笫一位bitvec.set(bitvec.size() - 1); // 置位最后一位bitvec.set(0,0); // 复位第一位bitvec.reset(i); // 复位第i位bitvec.test(0); // 返回false,因为笫一位是复位的bitvec[0] = 0; // 将第一位复位bitvec[31] = bitvec[0]; // 将最后一位设置为与第一位一样bitvec[0].flip(); // 翻转笫一位~bitvec[0]; // 等价操作,也是翻转笫一位bool b = bitvec[0]; // 将bitvec[0]的值转换为bool类型//不能放入给定类型中,则这两个操作会抛出一个overflow_error 异常unsigned long ulong = bitvec.to_ulong();bitset<16> bits;cin >> bits; //从cin读取最多16个0或1
