分类: C/C++
2011-08-12 12:25:51
参考一《C++Primer4th第四版中文版》
有些程序要处理二进制位的有序集,每个位可能包含 0(关)1(开)值。位是用来保存一组项或条件的 yes/no 信息(有时也称标志)的简洁方法。标准库提供的 bitset 类简化了位集的处理。 要使用 bitset 类就必须包含相关的头文件。
#include
using std::bitset;
bitset 对象的定义和初始化
在定义 bitset 时,要明确 bitset 含有多少位,须在尖括号内给出它的长度值:
bitset
bitset
bitset
bitset
/*
* 用unsigned 值初始化bitset 对象
* Lzy 2011-8-12
*/
#include
#include
using namespace std;
int main(void)
{
bitset<16> bitvecl(0xffff);// bits 0 ... 15 are set to 1
bitset<32> bitvecl(0xffff);// bits 0 ... 15 are set to 1; 16 ... 31 are 0
return 0;
}
/*
* 用string 对象初始化bitset 对象
* string 对象读入位集的顺序是从右向左
* Lzy 2011-8-12
*/
#include
#include
#include
using namespace std;
int main(void)
{
string strval("1100");
bitset<32> bitvec(strval);/*string 对象和bitsets 对象之间是反向转化的:string 对象
的最右边字符用来初始化bitset 对象的低阶位*/
string str("1111111000000011001101");
bitset<32> bitvec1(str,5,4);// 4 bits starting at str[5], 1100
bitset<32> bitvec6(str, str.size() - 4); // 取出str 末尾的四位来对bitvec6 的低四位进行初始化
return 0;
}
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.any() b 中是否存在置为 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 对象
* Lzy 2011-8-12
*/
#include
#include
#include
using namespace std;
int main(void)
{
string str("1111111000000011001101");
bitset<32> bitvec(str);
if(bitvec.any())
cout<<"is_set"<
else
cout<<"is_not_set"<
cout<<"1的个数: "<
cout<< bitvec.size()<<"位"<
return 0;
}
/*
* 访问bitset 对象中的位
* Lzy 2011-8-12
*/
#include
#include
#include
using namespace std;
int main(void)
{
bitset<32> bitvec;
for(int i=0; i != 32; i+=2)
bitvec.set(i); //bitvec[i]=1;
for(int i=0; i != 32; i++)
{
if(bitvec.test(i))
cout<<"1";
if(!bitvec[i])
cout<<"0";
}
return 0;
}
/*
* 对整个bitset 对象进行设置
* Lzy 2011-8-12
*/
#include
#include
#include
using namespace std;
int main(void)
{
bitset<32> bitvec;
bitvec.set(); //set all the bits to 1
for(int i=0; i != 32; i++)
{
if(bitvec.test(i))
cout<<"1";
else
cout<<"0";
}
cout<
bitvec.reset();// set all the bits to 0.
for(int i=0; i != 32; i++)
{
if(bitvec[i])
cout<<"1";
else
cout<<"0";
}
cout<
return 0;
}
/*
* 对整个bitset 对象进行设置
* Lzy 2011-8-12
*/
#include
#include
#include
using namespace std;
int main(void)
{
bitset<32> bitvec(0x5); //0101
bitvec.flip(0); //第位取反
bitvec.flip(); //按位取反
for(int i=0; i != 4; i++)
{
if(bitvec.test(i))
cout<<"1";
else
cout<<"0";
}
cout<
return 0;
}
/*
* 获取bitset 对象的值
* Lzy 2011-8-12
*/
#include
#include
#include
using namespace std;
int main(void)
{
bitset<32> bitvec(0x55); //0101
unsigned long ulong = bitvec.to_ulong();
cout<<"ulong = "<
cout<<"bitvec: "<
return 0;
}