bitset初始化问题
在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时候才可以