bitset是C++的类库,它便于我们管理一系列的bit位。
1.使用前加上头文件:
#include <bitset>
using namespace std;
//2.bitset的构造:
bitset<bitNum>b; //具有bitNUm位的b
/*
3.bitset的操作:
1)b.all()//b中是否全是1
2)b.any()//b中是否存在值为1的二进制位?
3)b.none()//b中不存在值为1的二进制位吗?
4)b.count()//b中含有多少个值为1的二进制位
5)b[pos]//访问b在pos位中的二进制(最右边的位为第一位(b[0]))
6)b.set()//把b中所有二进制位都置为1
7)b.set(pos)//把b中 b[pos] 置为1
8)b.reset()//把b中所有二进制位都置为0
9)b.reset(pos)//把b中 b[pos] 置为0
10)b.flip()//把b中所有二进制逐位取反
11)b.flip(pos)//把b中b[pos]取反
12)b.to_string()//用b中同样的二进制位返回一个字符串
13)b.to_ulong()//用b中同样的二进制位返回一个unsigned long值
14) b.to_ullong()//用b中同样的二进制位返回一个unsigned long long值
*/
//测试代码:
#include <iostream>
#include <stdio.h>
#include <bitset>
#include <string>
using namespace std;
int main()
{
bitset<5>b,c;//具有5个bit位的bitset b,c
//0的二进制:00000
//30的二进制:01111
b = 0;//从右往左,将30的5个bit位存入bitset b,此时b相当一个数组,下标从0开始
c = 30;
//printf("%d",b[0]);编译,出现错误,使用bitset不能用printf来访问
cout<<"b: "<<b<<endl;
cout<<"c: "<<c<<endl;
cout<<"c二进制位全是1吗? "<<c.all()<<endl;
cout<<"c 的bit位数 "<<c.size()<<endl;//之前定义的时候,bitNUm只取了5位
cout<<"b中存在为1的二进制吗? "<<b.any()<<" c中存在为1的二进制吗? "<<c.any()<<endl;
cout<<"b中不存在为1的二进制吗? "<<b.none()<<" c中不存在为1的二进制吗? "<<c.none()<<endl;
cout<<"b中有多少个为1的二进制位? "<<b.count()<<" c中有多少个为1的二进制位? "<<c.count()<<endl;
cout<<"b的第1位是:"<<b[0]<<endl;
cout<<"b的第5位是:"<<b[4]<<endl;
cout<<"c的第1位是:"<<c[0]<<endl;
cout<<"c的第5位是:"<<c[4]<<endl;
b.set();
cout<<"经过b.set()后,b变为"<<b<<endl;
b.reset();
cout<<"再经过b.reset()后,b变为"<<b<<endl;
c.set(0);
cout<<"经过c.set(0)后,c的第1位(c[0])变为:"<<c[0]<<endl;
c.reset(0);
cout<<"经过c.reset(0)后,c的第1位变为:"<<c[0]<<endl;
b.flip();
cout<<"再经过b.flip()后,b变为"<<b<<endl;
b.flip(4);
cout<<"经过b.flip(4),b的第5位变为:"<<b[4]<<endl;
cout<<"b转换为同样的字符串形式:";
string s = b.to_string();
cout<<s<<endl;
cout<<"b的二进制位返回的unsigned long:";
unsigned long x = b.to_ulong();
cout<<x<<endl;
return 0;
}
官方通道: bitset reference C++