bitset 类是一个类模板,具有固定的大小,定义一个 bitset 时,需要说明它包含多少个二进制位。
bitset<n> b; //@ b有n位,每一位都是0
bitset<n> b(u); //@ b是unsigned long long 值u的低n位的拷贝,如果n大于unsigned long long 的 大小,则b超出unsigned long long 的高位被置0
bitset<n> b(s,pos,m,zero,one); //@ b 是string s 从位置pos开始m个字符的拷贝,s只能包含字符0,1; 如果s中包含其他字符,构造函数会抛出 invalid_argument 异常,pos默 认为0,m默认为string::npos,zero 默认为 '0',one 默认为 '1'
bitset<n> b(cp,pos,m,zero,one); //@ 从cp指向的字符数组中拷贝字符串,如果未提供m,则cp必须指向一个C 风格字符串,如果提供了m,则从cp开始必须至少有m个0,1 字符
bitset<13> bitvec1(0xbeef); //@ bitvec1 比初始值小,初始值中的高位被丢弃
cout << bitvec1 << endl; //@ ?1111011101111?
bitset<20> bitvec2(0xbeef); //@ bitvec2 比初始值大,初始值中的高位被填充0
cout << bitvec2 << endl; //@ 00001111011101111?
bitset<128> bitvec3(~0ULL); //@ 64 位机器中,long long 0ULL是64个0比特,因此~0ULL是64个1
cout << bitvec3 << endl; //@ 0~63 是1,64~127是0
bitset<32> bitvec4("1100"); //@ 2,3 位为1,剩余的两位是 0
cout << bitvec4 << endl; //@ 00000000000000000000000000001100
string str("1111111000000011001101");
//@ 使用子串初始化
bitset<32> bitvec5(str, 5, 4); //@ 从str[5] 开始是的4个二进制位
cout << bitvec5 << endl;
bitset<32> bitvec6(str, str.size()-4); //@ 使用最后4个字符
cout << bitvec6 << endl;
这里需要注意 string 的索引和 bitset 的索引是不同的。
下表中置位表示置为1,复位表示置为0:
成员函数 | 函数功能 |
---|---|
bs.any() | 是否有置位的二进制位 |
bs.all() | 是否所有的二进制位都被置位 |
bs.none() | 不存在置位的二进制位 |
bs.size() | 位数 |
bs.count() | 被置位的二进制位个数 |
bs.test(pos) | pos 是置位的返回true,否则返回false |
bs.set() | 全部位置1 |
bs.set(pos,v) | pos 置成bool值v,v默认是true |
bs.reset() | 所有二进制位复位 |
bs.reset(pos) | pos 复位 |
bs.flip() | 全部位逐位取反 |
bs.flip(pos) | pos 二进制位取反 |
bs[pos] | 访问 pos 处的二进制位 |
bs.to_ulong() | 将二进制转换为unsigned long输出 |
bs.to_ullong() | 将二进制转换为unsigned long long输出 |
bs.to_string() | 将二进制转换为字符串输出 |
~bs | 按位取反 效果等效为bs.flip() |
os << b | 将二进制位输出到os流 小值在右,大值在左 |
is >> b | 从is读取字符存入b。 |
对于 to_ulong,to_ullong ,如果 bitset 中的值不能放入给定类型中,则这两个操作会抛出 overflow_error 异常。
原文:https://www.cnblogs.com/xiaojianliu/p/12384400.html