bitset 模板類由若干個位(bit)組成,它提供一些成員函數,使程式設計師不必通過位運算就能很方便地存取、修改其中的任意一位。bitset 模板類在標頭檔案 <bitset> 中定義如下:
template <size_t N>
class bitset
{
...
};
size_t 可看作 unsigned int。將 bitset 範例化時,N 必須是一個整型常數。例如:
bitset <40> bst;
則 bst 是一個由 40 個位組成的物件,用 bitset 的成員函數可以方便地存取其中任意一位。bitset 中的位從 0 開始編號,第 0 位是最右邊的位。
bitset 有許多成員函數,有些成員函數執行的就是類似於位運算的操作。bitset 成員函數列表如下:
-
bitset <N> & operator &= (const bitset <N> & rhs); //和另一個 bitset 物件進行與操作
-
bitset <N> & operator |= (const bitset <N> & rhs); //和另一個 bitset 物件進行或操作
-
bitset <N> & operator ^= (const bitset <N> & rhs); //和另一個 bitset 物件進行互斥或操作
-
bitset <N> & operator <<= (size_t num); //左移 num 位
-
bitset <N> & operator >>= (size_t num); //右移 num 位
-
bitset <N> & set(); //將所有位全部設成 1
-
bitset <N> & set(size_t pos, bool val = true); //將第 pos 位設為 val
-
bitset <N> & reset(); //將所有位全部設成0
-
bitset <N> & reset (size_t pos); //將第 pos 位設成 0
-
bitset <N> & flip(); //將所有位翻轉(0變成1,1變成0)
-
bitset <N> & flip(size_t pos); //翻轉第 pos 位
-
reference operator[] (size_t pos); //返回對第 pos 位的參照
-
bool operator[] (size_t pos) const; //返回第 pos 位的值
-
reference at(size_t pos); //返回對第 pos 位的參照
-
bool at (size_t pos) const; //返回第 pos 位的值
-
unsigned long to_ulong() const; //將物件中的0、1串轉換成整數
-
string to_string () const; //將物件中的0、1串轉換成字串(Visual Studio 支援,Dev C++ 不支援)
-
size_t count() const; //計算 1 的個數
-
size_t size () const; //返回總位數
-
bool operator == (const bitset <N> & rhs) const;
-
bool operator != (const bitset <N> & rhs) const;
-
bool test(size_t pos) const; //測試第 pos 位是否為 1
-
bool any() const; //判斷是否有某位為1
-
bool none() const; //判斷是否全部為0
-
bitset <N> operator << (size_t pos) const; //返回左移 pos 位後的結果
-
bitset <N> operator >> (size_t pos) const; //返回右移 pos 位後的結果
-
bitset <N> operator ~ (); //返回取反後的結果
-
bitset <N> operator & (const bitset <N> & rhs) const; //返回和另一個 bitset 物件 rhs 進行與運算的結果
-
bitset <N> operator | (const bitset <N> & rhs) const; //返回和另一個 bitset 物件 rhs 進行或運算的結果
-
bitset <N> operator ^ (const bitset <N> & rhs) const; //返回和另一個 bitset 物件 rhs 進行互斥或運算的結果
下面的程式演示了 bitset 的用法。
#include <iostream>
#include <bitset>
#include <string>
using namespace std;
int main()
{
bitset<7> bst1;
bitset<7> bst2;
cout << "1) " << bst1 << endl; //輸出 1) 0000000
bst1.set(0,1);//將第0位變成1,bst1變為 0000001
cout << "2) " << bst1 << endl; //輸出 2) 0000001
bst1 <<= 4; //左移4位元,變為 0010000
cout << "3) " << bst1 << endl; //輸出 3) 0010000
bst2.set(2);//第二位設定為1,bst2變成 0000100
bst2 |=bst1; // bst2變成 0010100
cout << "4) " << bst2 << endl; //輸出 4) 0010100
cout << "5) " << bst2.to_ulong () << endl; //輸出 5) 20
bst2.flip(); //每一位都取反,bst2變成 1101011
bst1.set(3); //bst1變成 0011000
bst2.flip(6); //bst2變成 0101011
bitset<7> bst3 = bst2^ bst1;//bst3 變成 0110011
cout << "6) " << bst3 << endl; //輸出 6) 0110011
cout << "7) " << bst3[3] << "," << bst3[4] << endl; //輸出 7) 0,1
return 0;
}