代码改变世界

bitset

2012-08-13 21:20  残月星辰  阅读(320)  评论(0编辑  收藏  举报

有些程序要处理二进制位的有序集,每一个位可能包含0 1值。位是用来保存一组项或条件的yes/no信息的简介方法。标准库提供的bitset类简化了位集的处理。

头文件及其声明:

#include<bitset>
using std::bitset;

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开始的&nbps;n个位副本

bitset<32>bitves://32位,全部都是0;

用string对象初始化bitset对象

string对象直接表示为位模式。从string对象读入位集的顺序是从右向左:

string  strval("1100");

bitset<32> bitvect(strval);

string对象和bitset对象之间是反向转化:string对象的最右边字符(即下标最大的那个字符)用来初始化bitset对象的低阶位

(即下标为0位)。当用string对象初始化bitset对象时,要记住这一差别。

例1:

View Code
 1 #include<iostream>
 2 #include<string>
 3 #include<bitset>//bitset头文件
 4 using namespace std;
 5 using std::string;
 6 using std::bitset;
 7 int main()
 8 {
 9    string str("1001001100") ;
10    bitset<32>bitvec5(str,6,4);
11    cout<<bitvec5<<endl;
12    return 0;
13 }

输出结果:

这里用str从第六位的1开始 取四位 1100 ,bitvec5的从3到0的二进制位置1100,其他二进制都置为0。

例2:

View Code
 1 #include<iostream>
 2 #include<vector>//包含头文件
 3 #include<string>
 4 #include<bitset>
 5 using namespace std;
 6 using std::string;
 7 using std::vector;
 8 using std::bitset;
 9 int main()
10 {
11    string str("1001001100") ;
12    bitset<32>bitvec5(str,str.size()-4);//use last 4
13    cout<<bitvec5<<endl;
14    return 0;
15 }

输出结果:

本例中,取出str末尾的四位来对bitvec5的低四位进行初始化。bitvec5其余的位初始化为0.

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中在pos处的二进制位取反
b.to_ulong() 把b中同样的二进制位返回一个unsign long值
os<<b 把b中的位集输出到os流