認識標准庫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 }