bitset类型使得位运算更为容易,定义在头文件bitset中

定义和初始化bitset

定义bitset时需声明包含多少位:

bitset<32> bits(1u);//定义一个32位第一位为1 其他位为0 的bitset

bitset初始化的方法:

bitset<n> b;  n位均为0
bitset<n> b(u); 对u的低n位拷贝
bitset<n> b(s, pos, m, zero, one); 拷贝字符串s的pos位置开始的m个字符,字符串包含zero和one字符
bitset<n> b(cp, pos, m, zero, one); 拷贝数组cp的pos位置开始的m个字符,字符串包含zero和one字符

用unsigned初始化:

bitset<13> b1(0xbeef);
bitset<20> b2(0xbeef);
bitset<128> b3(~0ull);
cout << b1 << endl;
cout << b2 << endl;
cout << b3 << endl;

C++primer 17.2 bitset类型_位运算

从一个string初始化bitset:
注意string的下标习惯与bitset恰好相反。

string s = "1111111000001010101110";
bitset<20> b1("1100");
bitset<20> b2(s,5,4);
bitset<20> b3(s,s.size()-4);
cout << b1 << endl;
cout << b2 << endl;
cout << b3 << endl;

C++primer 17.2 bitset类型_初始化_02

bitset操作

置位操作即为 1,复位操作为 0

bitset<32> b; 
b.any(); 是否存在置位的二进制位
b.all(); 是否所有置位的二进制位
b.none(); 是否不存在置位的二进制位
b.count(); 置位的二进制位个数
b.size(); 二进制位数
b.test(pos); 是否pos置位的二进制置位
b.set(pos,v); pos位置置位v
b.set(); 默认set为true
b.reset(pos); pos位置复位
b.reset();
b.flip(pos); 改变pos位置的状态
b.flip();
b[pos];
b.to_string();
b.to_ullong();
b.to_ulong();
os << b;
is >> b;

提取bitset的值:

bitset<32> b ("1100");
unsigned long long uu = b.to_ullong();
cout << uu << endl;

C++primer 17.2 bitset类型_初始化_03

bitset 的 IO 运算:
输入直至读取的位数达到对应大小,或遇到非法字符,或文件结束。

bitset<12> b;
cin >> b;
cout << b << endl;

C++primer 17.2 bitset类型_bitset_04

bitset的使用:
和普通位运算基本一致,不过多了一些操作的方法,就不赘述了。