本文為《C++ Primer》的讀書筆記
目錄
- 定義和初始化`bitset`
- 默認初始化
- 使用`unsigned long long` 初始化
- 從一個`string` / 字符陣列 初始化`bitset`
- `bitset`操作
#include <bitset>
標準庫定義了bitset類, 使得位運算的使用更為容易, 并且能夠處理超過最長整型型別大小的位集合
定義和初始化bitset
可以通過位置來訪問
bitset中的二進制位,例如,bitvec包含編號從0到31的32個二進制位,編號從0開始的二進制位被稱為低位(low-order),編號到31結束的二進制位被稱為高位(high-order)
默認初始化

bitset類似array,具有固定的大小,大小必須是一個常量運算式,當我們定義一個bitset時,需要宣告它包含多少個二進制位:
bitset<32> bitvec; // 32位;全部位均為0
使用unsigned long long 初始化

當我們使用一個整型值來初始化bitset時,此值將被轉換為unsigned long long型別并被當作位模式來處理,bitset中的二進制位將是此模式的一個副本,如果bitset的大小大于一個unsigned long long中的二進制位數, 則剩余的高位被置為0,如果bitset的大小小于一個unsigned long long中的二進制位數, 則超出bitset大小的高位被丟棄:
// bitvecl比初始值小;初始值中的高位被丟棄
bitset<13> bitvecl(Oxbeef); //二進制位序列為1111011101111
// bitvec2比初始值大;它的高位置0
bitset<20> bitvec2(Oxbeef); //二進制位序列為00001011111011101l ll
// 在64位機器中,long long OULL是64個0位元, 因此~OULL是64個1
bitset<l28> bitvec3(~OULL); // 0~63位為l; 63~127位為0
從一個string / 字符陣列 初始化bitset

我們可以從一個string或一個字符陣列指標來初始化bitset,兩種情況下, 字符都直接表示位模式,字串中下標最小的字符對應高位:
bitset<32> bitvec4("1100"); // 2 、3兩位為1, 剩余兩位為0
如果string包含的字符數比bitset少, 則bitset的高位被置為0,
注意:
string的下標編號習慣與bitset恰好相反:string中下標最大的宇符(最右字符)用來初始化bittset中的低位(下標為0的二進制位)
我們可以只用一個子串作為初始值:
string str("lllllll000000011001101");
bitset<32> bitvec5(str, 5, 4); //從str[5]開始的四個二進制位,1100
bitset<32> bitvec6(str, str.size()-4); //使用最后四個字符
bitset操作
bitset操作定義了多種檢測或設定一個或多個二進制位的方法,bitset類還支持位運算子

下標運算子對const屬性進行了多載,const版本的下標運算子在指定位置位時回傳true, 否則回傳false,非const版本回傳bitset定義的一個特殊型別, 它允許我們操縱指定位的值:
bitvec[0] = 0; // 將第一位復位
bitvec[31] = bitvec[0]; // 將最后一位設定為與笫一位一樣
bitvec[0].flip(); // 翻轉笫一位
~bitvec[0]; // 等價操作, 也是翻轉笫一位
bool b = bitvec[0]; // 將bitvec[0]的值轉換為boo! 型別
bitset 的輸入運算子從一個輸入流讀取字符, 保存到一個臨時的string物件中,直到讀取的字符數達到對應bitset的大小時,或是遇到不是1或0的字符時,或是遇到檔案尾或輸入錯誤時,讀取程序才停止,隨即用臨時string物件來初始化bitset ,如果讀取的字符數小于bitset 的大小, 則與往常一樣, 高位將被置為0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/194227.html
標籤:其他
