位使用来保存一组项或条件的yes/no信息的简洁方法。标准库提供的bitset类简化位集的处理
bitset对象的定义和初始化
类似于vector,bitset类是一种类模板:而与vector不一样的是bitset类型对象的区别仅在其长度而不在其类型。
bitset<32> bitvec;
给出的常量值必须是常亮表达式。长度值必须定义为整型字面值常量或是已用常量初始化的整型的const对象。
和vector的元素一样bitset中的位是没有命名的,程序员只能按位置来访问它们。
位集合的位置编号从0开始,因此bitvec的位序是从0~31.以0位开始的位串是低阶位的,以31结束的位串是高阶位的
初始化的几种形式:
bitset
b.any();
b.none();
b.count();
b.size();
b[pos];
b.test(pos);
b.set();
b.set(pos);
b.reset();
b.reset(pos);
b,flip();
b.flip(pos)
b.to_ulong();
os<<b;
如果想知道置为1的二进制位个数,可以使用count操作,该操作返回置为1的二进制制位个数。
size_t bits_set = bitvec,count();
size_t类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的c++版本。他是一个与及其相关的unsigned类型,其大小足以保证存储内存中对象大小。
与vector和string中size操作一样,bitsize的size操作返回bitsize对象中二进制位的个数,返回值的类型是size_t:
size_t sz= bitvec,size();
访问bitset对象中的位
可以用下标操作来读或写某个索引位置的二进制位
获取bitset对象的值
to_ulong操作返回一个unsigned long值,该值与bitset对象的位模式存储值相同。仅当bitset类型的长度小于或等于unsigned long的长度的时,才可以使用to_ulong操作。
to_ulong操作主要用于把bitset对象转到c风格或标准c++之前风格的程序上。如果bitset对象包含的二进制位数超过unsigned long长度 ,将会产生运行时异常。
int main(int argc, char**argv) {
//bitset<32>bitvec2(0xffffffffffffffff);//64位机表示的数的最大表示
//unsigned long ulong = bitvec2.to_ulong();
//cout << "bitvec2:" << bitvec2 << endl;
//cout << "ulong" << ulong << endl;
//string strval = "1100";
//bitset<32> bitvec4(strval);
//size_t bits_size = bitvec4.count();
//cout << "bitvec4:" << bitvec4 << endl;
//cout << "count:" << bits_size << endl;
//bitvec4.flip();
//cout << "bitsize" << bitvec4 << endl;
int i = 0;
vector<int>ivec;
while (cin >> i) {
ivec.push_back(i);
}
bitset<32>bitvec(0xffff0fff0);
// vector<int>::size_type ix = 1,iy = 2,iz = 3,ia = 5,ib = 8,ic = 13,id = 21;
//位数索引从右起
for (vector<int>::size_type ix = 0; ix != ivec.size(); ix++) {
if (!bitvec.test(ivec[ix]))
{
bitvec.set(ivec[ix]);
}
}
cout << "bitvec:" << bitvec << endl;
system("pause");
return 0;
}