C++STL bitset介紹與使用方法
阿新 • • 發佈:2019-01-01
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;
}