#include <iostream>
#include <fstream>
#include <bitset>
using namespace std;
int main() {
bitset <8> b(10100111);
bitset <8> bb;
ofstream ofs( "1.txt ", ios::binary);
ofs.write((char*)&b, sizeof(b)); //写入 b
cout < < "b: " < <b < <endl;
ofs.close();
ifstream ifs( "1.txt ", ios::binary);
ifs.read((char*)&bb, sizeof(bb));
cout < < "bb: " < <bb < <endl;
ifs.close();
}
标准库中 bitset类型用来处理二进制位的有序集, bitset类型简化了位集的处理,使用 bitset时需要包含头文件 #include<bitset>
1、 bitset对象的定义和初始化
bitset也是类模板,不过 bitset类型对象之间的区别在于长度而不是类型,因此 bitset模板的参数是长度类型
初始化方法 | 说明 |
bitset<n> b; | b有 n位,每位都为 0 |
bitset<n> b(u); | b是 unsigned long型 u的一个副本 |
bitset<n> b(s); | b是 string对象 s中含有的位串的副本,s是01串 |
bitset<n> b(s, pos, n); | b是 s中从位置 pos开始的 n个位的副本 |
2、 用 unsigned long值初始化 bitset对象
用 unsigned long值初始化 bitset对象的时候,将 long值转化为二进制模式,然后拷贝到 bitset的右方( bitset右边为低阶位,左边为高阶位), string位数多了将被截断,少了 bitset将在前面补零。
3、 用 string对象初始化 bitset对象
从 string对象初始化 bitset对象,需要注意的是,复制拷贝相当于从 string位模式平移到了 bitset。
例如:
string str( ”11001010”);
bitset<32> bitvec(str);
这个时候, bitvec是这样的: 0000 0000 0000 0000 0000 0000 1100 1010最右边是 bitset的低阶位,即 bitvec[0], bitset[1] …
4、 bitset对象上的操作
操作调用方式 | 操作说明 |
b.any() | 测试 b中是否有存在 1的位 |
b.none() | 测试 b中是否全 0 |
b.count() | 测试 b中置 1的位个数 |
b.size() | b中所有二进制位个数 |
b[pos] | 访问下标为 pos位置的位值 |
b.test(pos) | 测试 pos位置的二进制位是否为 1 |
b.set() | 将 b所有位置 1 |
b.set(pos) | 将 b中 pos位置的位置 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流 |