bitest(位集合)------c++程序设计原理与实践(进阶篇)
标准库模板类bitset是在<bitset>中定义的,它用于描述和处理二进制位集合。每个bitset的大小是固定的,在创建时指定:
bitset<4> flags; bitset<128> dword_bits; bitset<12345> lots;
默认情况下,bitset被初始化为全0,但通常我们都会给它一个初始值,可以是一个无符号的整数或者”0“和”1“组成的字符串。例如:
bitset<4> flags=0xb; bitset<128>dword_bits{string{"1010101010101010"}}; bitset<12345>lots;
这两段代码中,lots被初始化为全0,dword_bits的钱112为被初始化为全0,后16位由程序显式指定。如果你给出的初始化字符串中包含0和1之外的符号,bitset会抛出一个std::invalid_argument异常:
string s; cin>>s; bitset<12345> my_bits(s); //可能抛出std::invalid_argument
常用的位运算符都可用于bitset。例如,假定b1、b2和b3都是bitset:
b1=b2&b3; //与 b1=b2|b3; //或 b1=b2^b3; //异或 b1=~b2; //补 b1=b2<<2; //左移 b1=b2>>3; //右移
大致来说,对于位运算而言,bitset就像unsigned int 一样,只不过其大小任意,由用户指定。你能对unsigned int 做什么(除了算术运算之外),就能对bitset做什么。特别地,bitset对I/O也很有用:
cin>>b; //从输入读取一个bitset cout<<bitset<8>('c'); //输出字符'c'的位模式
当读入bitset时,输入流会寻找0和1,例如,如果输入下面的内容:
10121
输入流会读入101,21会被留下。
对于字节和字,bitset中的位是由右至左编号的(从最低有效位到最高有效位)。这样,第7位的值就是27;
7: | 6: | 5: | 4: | 3: | 2: | 1: | 0: |
1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 |
对于bitset而言,编号顺序不仅仅是遵循惯例的问题,还起到二进制位的索引下标的作用。例如:
#include <iostream> #include<bitset> using namespace std; int main(){ int n; const int j = n; constexpr int max = 10; for (bitset<max> b; cin >> b;) { cout << b << '\n'; for (int i = 0; i < max; ++i)cout << b[i]; cout << '\n'; } }
c++程序设计原理与实践(进阶篇)