C++ Primer 學習筆記與思考_5 bitset你用的正確嗎?
阿新 • • 發佈:2019-01-03
bitset型別比整型值上的低階位操作更容易使用,簡化了位集的處理。在定義bitset時,要明確bitset含有的位數,在尖括號內給出它的長度值。
注意位集合的編號從0開始,低位存低階位。
string物件和bitset物件之間的轉換是反向的,string物件的最右邊字元用來初始化bitset物件的低階位。其實這一點不用特別記憶,因為假如定義的物件是bitset<4> b(“1101”);那麼輸出b也是1101,之所以上面那麼說是因為bitset下標從右邊開始。
注意位集合的編號從0開始,低位存低階位。
最重要的一個問題:bitset的下標是從右邊開始的!!!!很多人的部落格都寫錯了,希望引起大家注意。
1.使用unsigned long值初始化bitset物件
若bitset型別長度大於unsigned long值的二進位制位數,則其餘的高階位將置為0;若bitset型別長度小於unsigned long值的二進位制位數,則只使用unsigned 值中的低階位,超過bitset型別長度的高階位將被捨棄。
2.用string物件初始化bitset物件bitset<16> bitvec1(0xffff);// 0...15 set to 1 bitset<32> bitvec2(0xffff); // 0..15 set to 1;16...31 set to 0 bitset<128> bitvec3(0xffff); // 32...127 initialized to zero
string物件和bitset物件之間的轉換是反向的,string物件的最右邊字元用來初始化bitset物件的低階位。其實這一點不用特別記憶,因為假如定義的物件是bitset<4> b(“1101”);那麼輸出b也是1101,之所以上面那麼說是因為bitset下標從右邊開始。
3.bitset物件上的操作
以上一些操作的實際應用
#include <iostream> #include <string> #include <cstring> #include <bitset> using namespace std; int main() { unsigned long m; cin >> m; bitset<16> b(m); //使用unsigned long初始化 cout << b << endl; string str("10011"); bitset<16> sa(str); //使用string初始化 result:10011 cout << sa << endl; bitset<32> bitve(0xffff); cout << bitve << endl; bitset<3> bs; bool flag = bs.any(); //false,all bits are zero bool is_ok = bs.none(); //true,all bits are zero size_t sz = bs.size(); //return 3 for (int index = 0; index != 3; index++) { sa[index] = 1; //sa.set(index); 等價 } // set和reset對整個物件進行設定 sa.set(); // set all the bits to 1 sa.reset(); // set all the bits to 0 sa.flip(0); sa[0].flip(); //與上面等價 sa.flip(); // reverses value of all bits unsigned long res = sa.to_ulong(); cout << res << endl; return 0; } <p>此外,我們來看一下和低階直接位操作的區別</p><p>設<span style="font-family:Times New Roman;">num</span><span style="font-family:宋體;">為</span><span style="font-family:Times New Roman;">unsigned long</span><span style="font-family:宋體;">資料型別</span></p> sa.set(27);// equal to num |= 1UL<<27;(num =num | 1UL<<27) sa.reset(27); // equal to num &= ~(1UL<<27)