原来C++中还有专门处理0,1操作的库类 bitset(从字面上解释,比特集合,集合貌似不贴切。)
1.bitset 是处理二进制位的有序集 ,每个位读只能是0或1.
#include <bitset>
using std::bitset;
2.bitset 对象的定义和初始化
bitset<32> bitvec; // 32 bits, all zero
在 32 位 unsigned long 的机器上,十六进制值 0xffff 表示为二进制位 就是十六个 1 和十六个 0(每个 0xf 可表示为 1111)。可以用 0xffff 初始 化 bitset 对象
// bitvec1 is smaller than the initializer
bitset<16> bitvec1(0xffff); // bits 0 ... 15 are set to 1
// bitvec2 same size as initializer
bitset<32> bitvec2(0xffff); // bits 0 ... 15 are set to 1;16 ... 31 are 0
// on a 32-bit machine, bits 0 to 31 initialized from 0xffff
bitset<128> bitvec3(0xffff); // bits 32 through 127 initialized to zero
用 string 对象初始化 bitset 对象
当用 string 对象初始化 bitset 对象时,string 对象直接表示为位模式。
从 string 对象读入位集的顺序是从右向左(from right to left):
string strval("1100");
bitset<32> bitvec4(strval);
bitvec4 的位模式中第 2 和 3 的位置为 1,其余位置都为 0。如果 string 对 象的字符个数小于 bitset 类型的长度,则高阶位置为 0。
当用 string 对象初始
化 bitset 对象时,记住这一差别很重要。
不一定要把整个 string 对象都作为 bitset 对象的初始值。相反,可以只 用某个子串作为初始值:
string str("1111111000000011001101");
bitset<32> bitvec5(str, 5, 4); // 4 bits starting at str[5], 1100
bitset<32> bitvec6(str, str.size() - 4); // use last 4 characters
表 3.7. bitset 操作 |
|
b.any() |
b 中是否存在置为 1 的二进制位? |
b.none() |
b 中不存在置为 1 的二进制位吗? |
b.count() |
b 中置为 1 的二进制位的个数 |
b.size() |
b 中二进制位的个数 |
b[pos] |
访问 b 中在 pos 处二进制位 |
b.test(pos) |
b 中在 pos 处的二进制位置为 1 么? |
b.set() |
把 b 中所有二进制位都置为 1 |
b.set(pos) |
把 b 中在 pos 处的二进制位置为 1 |
表 3.7. bitset 操作 |
|
b.any() |
b 中是否存在置为 1 的二进制位? |
b.reset() |
把 b 中所有二进制位都置为 0 |
b.reset(pos)
|
把 b 中在 pos 处的二进制位置为 0 |
b.flip() |
把 b 中所有二进制位逐位取反 |
b.flip(pos) |
把 b 中在 pos 处的二进制位取反 |
b.to_ulong()
|
用 b 中同样的二进制位返回一个 unsigned long 值 |
os << b |
把 b 中的位集输出到 os 流 |