天天看點

C++的bitset

bitset 的定義和初始化:

  1、bitset<size> b;  //b 有 size 位,每位都是預設值 0

  2、bitset<size> b(num);  //b 是 unsigned long 型 num 的一個副本

  3、bitset<size> b(str);  //b 是 string 對象 str 中的位串副本,即 01 字元串

  4、bitset<size> b(str, pos);  //b 是 str 從位置 pos 開始的位串的副本 (從左往右)

  5、bitset<size> b(str, pos, n);  //b 是 str 中從位置 pos 開始,向後 n 位的副本

注:位是用來儲存一組項或條件的yes/no資訊的簡潔方法,标準庫提供了bitset類使得處理位集合更加友善

bitset 的幾個注意點:

  1、bitset 最右邊為下标開始,而 string 最左邊!!!

  2、bitset 支援位運算

  3、可以通過下标來通路

  4、包括函數:all(), any(), none(), test(), set([], []), reset([]), flip([]), size(), count(), to_string(zero, one), to_ullong(), to_ulong()

#include <iostream>
#include <string>
#include <bitset>

using namespace std;

int main()
{
//    bs 為 unsigned long 137 的低 16 位拷貝 
//    to_ullong or to_ulong 傳回相應的值 
    bitset<16> bs(137);
    cout<<bs.to_ullong()<<" 的低 16 位拷貝為:"<<bs<<endl;
    
//    str 的值隻能為 0 或 1 
    string str = "10101101"; 
    bitset<16> bs_t(str);
    cout<<"二進制碼 "<<str<<" 對應的值為:"<<bs_t.to_ulong()<<endl; 
    
//    從下标為 1 到字元串末尾的拷貝 
    bitset<16> bs_m(str, 1, str.size());
    cout<<"除去二進制碼 "<<str<<" 的最高一位後相應的 bitset:"<<bs_m<<endl;
    
//    bitset 支援 IO 流, 下面最多輸入 16 個 0 或 1 
    bitset<16> bs_n;
    cout<<"請輸入不超過 16 個 0 或 1:"; 
    cin>>bs_n;
    cout<<"輸入的二進制碼的低 16 位為:"<<bs_n<<endl; 
    
//    to_string(zero, one) 預設 zero 為 '0',one為 '1' 
    cout<<"輸出二進制碼的字元串形式:"<<bs_n.to_string('*', '#')<<endl;
    
    cout<<"輸入的二進制碼是否有置位了的:"<<boolalpha<<bs_n.any()<<endl;
    cout<<"輸入的二進制碼是否全部置位了:"<<bs_n.all()<<endl;
    cout<<"輸入的二進制碼是否全部沒有置位:"<<bs_n.none()<<endl;
//    test(index) 會檢查下标越界,而 [] 則不檢查 
    cout<<"二進制碼的第一位是否被置位了:"<<bs_n.test(0)<<noboolalpha<<endl;
    
//    count() 和 size() 的傳回類型為 size_t 
    cout<<"輸入的二進制碼有 "<<bs_n.count()<<" 個被置位了"<<endl;
    cout<<"輸入的二進制碼大小為:"<<bs_n.size()<<endl;
    
//    通過 set(index, flag), reset(index), flip(index) 可實作更詳細的操作 
    cout<<"置位全部二進制碼:"<<bs.set()<<endl;
    cout<<"複位全部二進制碼:"<<bs_n.reset()<<endl;
    cout<<"改變全部二進制碼:"<<bs_n.flip()<<endl;
    
    system("pause");
    
    return 0;
}