初始化
#include<bitset>
bitset<n> b; // b有n位;每一位均为0。此构造函数是一个constexpr
bitset<n> b(u); // u的低n位的拷贝,u的类型unsigned long long
// 如果n>unsignedlonglong的大小,
// 则b中超出unsignedlonglong的高位被置为0。
// 此构造函数是一个constexpr
bitset<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比初始值大;它的高位被置为0
bitset<20> bitvec2(0xbeef); // 二进制位序列为00001011111011101111
// 在64位机器中,0ULL是64个0bit,因此~OULL是64个1
bitset<128> bitvec3(~0ULL); // 0~63位为1;63~127位为0
// string的0下标是位的最高位。
bitset<32> bitvec4("1100"); // 28个0 + 1100
string str("1111111000000011001101");
bitset<32> bitvec5(str, 5, 4); // 从str[5]开始的四个二进制位,1100
bitset<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,否则返回false
b.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,否则返回false
b.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和1
os << b; // 将b中二进制位打印为字符1或0,打印到os流
is >> b; // 从is读取字符存入b。当下一个字符不是1或0时,
// 或是已经读入b.size()个位时,读取过程停止
bitset<32> bitvec(1U); // 32位:低位为1,剩余位为0
boolis_set = bitvec.any(); // true,因为有1位置位
boolis_not_set = bitvec.none(); // false,因为有1位置位了
boolall_set = bitvec.all(); // false,因为只有1位置位
size_t onBits = bitvec.count(); // 返回1
size_t sz = bitvec.size(); // 返回32
bitvec.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