1. 程式人生 > >C++Primer_Chap17_標準庫特殊設施_List02_bitset型別_筆記

C++Primer_Chap17_標準庫特殊設施_List02_bitset型別_筆記

  定義在標頭檔案bitset中的bitset類使位運算的使用更為容器,並且能夠處理超過最長整型型別大小的位集合。

#include <bitset>

定義和初始化bitset

  當我們定義一個bitset時,需要宣告它包含多少個二進位制位。

bitset<32> bitvec(1U);    //32位;低位為1,其他位為0

  二進位制位的位置是從0開始編號的。因此,bitvec包含編號從0到31的32個二進位制位。編號從0開始的二進位制位被稱為低位(low-order),編號到31結束的二進位制位被稱為高位(high-order)

初始化bitset的方法
bitset<n> b; b有n位;每一位均為0.此建構函式是一個constexpr
bitset<n> b(u); b是unsigned long long值u的低n位的拷貝。如果n大於unsigned long long的大小,則b中超出unsigned long long的高位被置為0。如果n小於unsigned long long的二進位制位數,則丟棄超出bitset大小的高位。此建構函式是一個constexpr
bitset<n> b(s, pos, m, zero, one);

b是string s從位置pos開始m個字元的拷貝。s只能保護字元zero和one;如果s包含任何其他字元,建構函式會丟擲invalid_argument異常。字元在b中分別儲存為zero和one。pos預設為0,m預設為string::npos,zero預設為'0',one預設為'1'

bitset<n> b(cp, pos, m, zero, one); 與上一個建構函式相同,但從cp指向的字元陣列中拷貝字元。如果未提供m,則cp必須指向一個C風格字串。如果提供了m,則從cp開始必須至少有m個zero或one字元
接受一個string或一個字元指標的建構函式是explicit的。
bitset<13> bitvec1(0xBEEF);    //1 1110 1110 1111
bitset<20> bitvec2(0xbeef);    //0000 1011 1110 1110 1111
bitset<128> bitvec3(~0ULL);    //0~63:1    64~127:0

bit<32> bitvec4("1100");    //1100

  string的下標編號習慣和bitset恰好相反:string中下標最大的元素(最右字元)初始化bitset中的低位。

bitset操作

  

bitset操作
b.any() b中是否存在置位的二進位制位
b.all()

b中所有位置都置位了麼

b.none() b中不存在置位的二進位制位麼
b.count() b中置位的位數
b.size() 一個constexpr函式,返回b中的位數
b.test(pos) 若pos位置的位是置位的,返回true,否則返回false

b.set(pos, v)

b.set()

將位置pos處的位設定為bool值的v。v預設為true。

如果未傳遞實參,則將b中所有位置置位1

b.reset(pos)

b.reset()

將位置pos處的位復位0

將b中所有位復位0

b.flip(pos)

b.flip()

改變位置pos處的位的狀態

改變b中每一位的狀態

b[pos] 訪問b中位置pos處的位;如果b是const的,則該位為1時b[pos]返回一個bool值true,否則返回false

b.to_ulong()

b.to_ullong()

返回一個unsigned long或一個unsigned long long的值,其位模式與b相同。如果b中位模式不能放入指定的結果型別,則丟擲一個overflow_error異常
b.to_string(zero,one)

返回一個string,表示b中的位模式。zero和one的預設值分別是0和1,用來表示b中的0和1

os << b

將b中二進位制位列印為字元1或0,列印到流os中

is >> b

從is讀取字元存入b。當下一個字元不是1或0時,或是已經讀入b.size()個位時,讀取過程停止。