在C++primer上面說,bitset可以用unsigned long來進行初始化,但是上面的例子只是采用了常數如0xffff,而在實際中,當在vs2010中,我采用unsigned long類型的變量來進行初始化時,發現說出現錯誤,
error C2668: “std::bitset<_Bits>::bitset”: 對重載函數的調用不明確
測試了下,int是4個字節,unsigned long 4個字節,long也是4個字節,但是int 和long都可以用來進行初始化
下面是c++primer里關於bitse采用unsigned long和string進行初始化的講解,其中尤為注意的是,在bitset中是數的低位在前高位在后
下面是轉載的相關的bitset的內容:
功能:處理二進制位的有序集
#include<bitset>
using std::bitset;
初始化bitset變量的方法:
bitset<n> b; |
b有n位,每位都為0 |
bitset<n> b(u); |
b是unsigned long型u的一個副本 |
bitset<n> b(s); |
b是string對象s中含有的位串的副本 |
bitset<n> b(s, pos, n); |
b是s中從位置pos開始的n個位的副本 |
注意:n必須是常量表達式。
例如:
bitset<16> bitvec1(0xffff); // bits 0 ... 15 are set to 1
bitset<32> bitvec2(0xffff); // bits 0...15 are set to 1; 16...31 are 0
從string對象讀入位集的的順序是從右向左的
string strval("1100");
bitset<32> bitvec3(strval);
string對象和bitset對象之間是反向轉化的:string對象的最右邊字符(即下標最大的那個字符)用來初始化bitset對象的低階位(即下標為0的位)。當用string對象初始化bitset對象時,記住這一差別很重要。
bitset對象的操作
b.any() |
b中是否存在置為1的二進制位? |
b.none() |
b中不存在置為1的二進制位嗎? |
b.count() |
b中置為1的二進制位的個數 |
b.size() |
b中二進制位的個數 |
b[pos] |
訪問b中在pos處的二進制位 |
b.test(pos) |
b中在pos處的二進制位是否為1? |
b.set() |
把b中所有二進制位都置為1 |
b.set(pos) |
把b中在pos處的二進制位置為1 |
b.reset() |
把b中所有二進制位都置為0 |
b.reset(pos) |
把b中在pos處的二進制位置為0 |
b.flip() |
把b中所有二進制位逐位取反 |
b.flip(pos) |
把b中在pos處的二進制位取反 |
b.to_ulong() |
用b中同樣的二進制位返回一個unsigned long值 |
os << b |
把b中的位集輸出到os流 |
bitset<32> bitvec; //32bits,all zero
bool is_set=bitvec.any(); //false,all bits are zero
bool is_not_set=bitvec.none(); //true,all bits are zero
size_t bits_set=bitvec.count(); //返回一個size_t類型的bits_set值,統計1的個數
size_t類型是一個與機器相關的unsigned類型,大小足夠。
可以用下表操作符來讀寫或測試某個索引位置的二進制位:
for(int index=0;index!=32;index++){
bitvec[index]=0;
} //用下表操作符將所有位都置為零
for(int index=0;index!=32;index++){
bitvec.set(index);
} //用set操作將所有位都置為1
if(bitvec.test(i))
//測試第i位是否為1
if(bitvec[i])
//與上一個函數功能相同
bitvec.set(); //全部置一
bitvec.reset(); //全部置零
unsigned long ulong=bitvec.to_ulong();
cout<<"ulong="<<ulong<<endl; //當bitvec的長度小於unsigned long時候才可以