1. 程式人生 > >C++STL bitset介紹與使用方法

C++STL bitset介紹與使用方法

bitset

bitset主要是用於儲存二進位制位,在需要大量二進位制計算的專案中,直接使用bitset比利用陣列或者其它方式要更為方便,位運算在儲存狀態、模擬行動、搜尋很多方面有非常巨大的優勢

標頭檔案:#include
建構函式
bitset<16> first;  //構造一個16位的bitset物件,初始值預設為0
bitset<16> second(177);  //構造一個16位的bitset物件,將177轉換為二進位制,拷貝到記憶體空間
bitset<16> secont_m(Oxff20);  //整型常量,可以直接十進位制,也可以八進位制,十六進位制
bitset<16> third("1110011"); //將二進位制字串初始化到物件中 bitset<6> second_t(177); bitset<6> third_t("1110011"); cout << first << endl; cout << second << endl; cout << third << endl; cout << second_t << endl; cout << third_t << endl; for
(int i = 0; i < 16; i++) { cout << second[i]; } //輸出 /* 0000000000000000 0000000010110001 0000000001110011 110001 111001 1000110100000000 //由於bitset過載輸出定向符號,為了便於檢視,這裡輸出是逆向輸出,長度為n的bitset,是按照n-1——>0的順輸出 */
  • 需要注意以下幾點
    • bitset與其它容器不一樣,建立物件不需要提供容器變數型別,而是容器的大小,也即二進位制位數
    • 如果bitset空間比二進位制位數大,則在高位補0,(雖然上面輸出是左邊為0,但左邊是高位,也即其索引分別是15~0)
    • 在將整形常量轉換為二進位制過後,如果bitset位數不夠,則自動放棄原數值高位的二進位制位。
    • 將二進位制字串常量轉換為二進位制過後,如果bitset位數不夠,則自動放棄原二進位制字串低有效位(也即右邊的位)[這一點與整型常量有點不一樣]
    • 在將整數二進位制儲存到bitset中,整數的低位對應bitset的低位,也即bitset[0]儲存的原整數的二進位制最低有效位。
      bitset的低位為索引較小的位,也即陣列下標0開始的位置。整數及字串二進位制低位為右邊
位訪問方式
  • 訪問bitset的某一位
bitset<16> third("1110011");  //將二進位制字串初始化到物件中

cout << third[0] << endl;   //直接通過下標索引得到某一位的值
cout << third.count() << endl;  //統計bitset裡面1的位數
cout << third.size() << endl;   //返回bitset總的位數
bool flag = third.test(i);      //測試第i為是否被置為1
flag = third.any();     //測試是否至少有1位被置為1(至少一個1,則返回true,否則返回false)
flag = third.none();    //測試是否沒有一個被置為1(都是0,則返回true,否則false)
flag = third.all();   //(C++11)測試是否都是1(都是1,返回ture,否則返回false)
修改某一位
bitset<16> third("1110011");

third.set(i);      //將第i位置為1
third.set();       //將全部置為1
third.reset();     //將全部置為0
third.flip(i);     //將第i反轉(取反)
third.flip();      //將bitset全部進行反轉
整體轉換
bitset<16> first("110010");

cout << first.to_string() << endl;   //以二進位制字串形式輸出,將所有二進位制位輸出
cout <, first.to_ulong() << endl; //轉換為unsigned long整數,然後輸出
後記
  • 一直不知道STL裡面還有這個容器,可以非常方便的實現二進位制與十進位制的轉換,之前進位制轉換一直是自己來迴圈除或者累乘,以及通過與運算來進行位操作。下面是一段程式,利用bitset實現十進位制到二進位制的互相轉換。
#include <iostream>
#include <bitset>
#include <string>

using namespace std;

int main()
{
    int decNum = 0;
    string binStr = "";
    string resStr = "";
    bitset<32> first;
    bitset<32> second;

    int a = true;
    cout << a << endl;


    cout << "Please input the decimal number: ";
    cin >> decNum;

    cout << "Please input the binary string: ";
    cin >> binStr;

    first = bitset<32>(decNum);
    second = bitset<32>(binStr);

    int pos = -1;
    for (int i = first.size()-1; i >= 0; i--)
    {
        if (first[i])
        {
            pos = i;
            break;
        }
    }
    for (int i = pos; i >= 0; i--)
    {
        //string tmp = (int)first[i] + "";
        //resStr += tmp;
        first[i] ? resStr += "1" : resStr += "0";
    }


    cout << "The binary string of the decimal number: " << resStr << endl;
    cout << "The decimal number of the binary string:" << second.to_ulong() << endl; 

    return 0;
}