C++中的bitset

bitset

C++語言的一個類庫,用來方便地管理一系列的bit位而不用程序員自己來寫代碼。
bitset除了可以訪問指定下標的bit位以外,還可以把它們作爲一個整數來進行某些統計。
可以如下聲明一個該類型變量:
bitset<N>varm (M)
其中varm爲變量名。
N表示該類型在內存中佔的位數,是二進制。

M表示變量varm的初始值。


bitset操作

用整值類型表示位向量的問題在於使用位操作符來設置復位和測試單獨的位層次比較低也比較複雜.
例如用整值類型將第27 位設置爲1, 我們這樣寫 quiz1 |= 1<<27;
而用bitset 來做我們可以寫 quizl[ 27 ] = 1; 或 quiz1.set( 27 );
要使用bitset 類我們必須包含相關的頭文件
#include <bitset>


bitset 有三種聲明方式在缺省定義中我們只需簡單地指明位向量的長度例如
bitset< 32 > bitvec;聲明瞭一個含有32 個位的bitset 對象位的順序從0 到31 缺省情況下所有的位都被
初始化爲0 

爲了測試bitset 對象是否含有被設置爲1 的位我們可以使用any()操作當bitset 對象的一位或多個位被設置爲1 時any()返回true 對於bitvec .如下測試
bool is_set = bitvec.any();
它的結果當然是false 相反如果bitset 對象的所有位都被設置爲0 ,則none()操作返回 true 

對於bitvec 測試
bool is_not_set = bitvec.none();
結果爲true 

count()操作返回被設置爲1 的位的個數.
int bits_set = bitvec.count();
我們可以用set()操作或者下標操作符來設置某個單獨的位例如下面的for 循環把偶數位設置爲1.
for ( int index = 0; index < 32; ++ index )
    if ( index % 2 == 0 )
        bitvec[ index ] = 1;

類似地測試某個單獨的位是否爲1 也有兩種方式test()操作用位置做參數返回true 或false 例如
if ( bitvec.test( 0 ))
// 我們的bitve[0] 可以工作了!
同樣地我們也可以用下標操作符
cout << "bitvec: positions turned on:\n\t";
for ( int index = 0; index < 32; ++index )
    if ( bitvec[ index ] )
         cout << index << " ";
   cout << endl;
要將某個單獨的位設置爲0 ,我們可以用reset()或下標操作符下列兩個操作都將bitvec的第一位設爲0.
// 兩者等價都把第一位設置爲0
bitvec.reset( 0 );
bitvec[ 0 ] = 0;
我們也可以用set()和reset()操作將整個bitset 對象的所有位設爲1 或0 ,只要調用相應的操作而不必傳遞位置參數我們就可以做到這一點.例如
// 把所有的位設置爲0
bitvec.reset();
if ( bitvec.none() != true )
// 喔! 錯了
// 把所有的位設置爲1if ( bitvec.any() != true )
// 喔! 又錯了
flip()操作翻轉整個bitset 對象或一個獨立的位
bitvec.flip( 0 ); // 翻轉第一位
bitvec[0].flip(); // 也是翻轉第一位
bitvec.flip(); // 翻轉所有的位的值

還有兩種方法可以構造bitset 對象它們都提供了將某位初始化爲1 的方式:一種方法是爲構造函數顯式地提供一個無符號參數bitset 對象的前N 位被初始化爲參數的相應位值,例如
bitset< 32 > bitvec2( 0xffff );
將bitvec2 的低16 位設爲1
00000000000000001111111111111111
下面的bitvec3 的定義
bitset< 32 > bitvec3( 012 );
將第1 和3 位的值設置爲1 假設位置從0 開始計數
00000000000000000000000000001010
我們還可以傳遞一個代表0 和1 的集合的字符串參數來構造bitset 對象如下所示
// 與bitvec3 的初始化等價
string bitval( "1010" );
bitset< 32 > bitvec4( bitval );
bitvec4 和bitvec3 的第1 和3 位都被設置爲1 而其他位保持爲0
bitvec.set();



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章