認識標准庫bitset類型
位是用來保存一組項或者條件的yes/no(1或者0)信息的一種簡潔方法,那麼位集就是二進制位的有序集。C++中標准庫提供的bitset類在我們程序中就很有效的簡化了對於位集的處理。
我們要使用bitset,首先需要包含頭文件bitset。和vector對象不一樣的是bitset類型對象的區別僅在其長度而不在其類型。在定義bitset的時候,要明確bitset包含了多少位,須在尖括號內給出它的長度值。長度值必須定義為整形字面值常量或是已用常量值初始化的整型的const對象。
1 const int maxn=16; 2 bitset<32> bitvec2; 3 bitset<maxn> bitvec(1);
bitset中以0位開始的位串是低階位,以31位結束的位串是高階位。
1.用unsigned值初始化
當用unsigned long值作為bitset對象的初始值時,該值將轉化為二進制的位模式。而bitset對象中的位集作為這種位模式的副本。如果bitset類型長度大於unsigned long的值的二進制位數,則其余的高階位將置為0;如果bitset類型長度小於unsigned long值的二進制位數,則只使用unsigned值中的低階位,超過bitset類型長度的高階位將被丟棄。
1 bitset<32> bitvec3(0xffff); 2 cout<<bitvec3<<endl; 3 for (int i=0 ; i<bitvec3.size() ; i++) 4 cout<<bitvec3[i]<<" "; 5 cout<<endl;

2.用string對象初始化bitset對象
當用string對象初始化bitset對象時,string對象直接表示為位模式。從string對象讀入位集的順序是從右往左。
1 string str("11100");
2 bitset<8> bitvec5(str);
3 cout<<bitvec5<<endl;
4 for (int i=0 ; i<bitvec5.size() ; i++)
5 cout<<bitvec5[i]<<" ";

注意:string對象和bitset對象之間是反向轉化的,string對象的最右邊字符(即下標最大的那個字符)用來初始化bitset對象的低階位(即下標為0的位)。
和 vector一樣,bitset也可以通過下標操作符來讀寫某個索引位置的二進制位,同樣的,也可以用下標操作符來測試給定二進制位的值或者設置某個二進 制位的值。其實訪問bitset對象中的位就是一個for循環即可搞定,上文代碼插圖中就有提到,這裡就不作詳細介紹了。

1 #include<iostream>
2 #include<cstdio>
3 #include<cstdlib>
4 #include<cstring>
5 #include<cmath>
6 #include<algorithm>
7 #include<bitset>
8 using namespace std;
9 const int maxn=16;
10
11 int main()
12 {
13 bitset<16> b2;
14 cout<<"b2.any() = "<<b2.any()<<endl;
15 cout<<"b2.none()= "<<b2.none()<<endl;
16 cout<<"b2.size()= "<<b2.size()<<endl;
17 cout<<"b2[4]= "<<b2[4]<<endl;
18 cout<<"b2.test(4)= "<<b2.test(4)<<endl;
19 b2.set() ; cout<<endl;
20 cout<<"b2.any() = "<<b2.any()<<endl;
21 cout<<"b2.none()= "<<b2.none()<<endl;
22 cout<<"b2.size()= "<<b2.size()<<endl;
23 cout<<"b2[4]= "<<b2[4]<<endl;
24 cout<<"b2.test(4)= "<<b2.test(4)<<endl;
25 b2.reset() ; cout<<endl;
26 cout<<"b2.any() = "<<b2.any()<<endl;
27 cout<<"b2.none()= "<<b2.none()<<endl;
28 cout<<"b2.size()= "<<b2.size()<<endl;
29 cout<<"b2[4]= "<<b2[4]<<endl;
30 cout<<"b2.test(4)= "<<b2.test(4)<<endl;
31 b2.set(4) ; cout<<endl;
32 cout<<"b2[4]= "<<b2[4]<<endl;
33 cout<<"b2.test(4)= "<<b2.test(4)<<endl;
34 return 0;
35 }
