C++ bitset類詳解

2020-07-16 10:04:27
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;
}