说明:bitset 就像 vector 一样,是 C++ 的一个类模板库,用来对一个数的二进制位进行管理、判断等操作,使用时需要包含头文件 #include<bitset>。
1.声明及定义
格式:bitset<N> var(M)
其中 varm 为 bitset 的类对象,N 表示该对象所占的位数,这里的位数指的是二进制。M 指的是 var 的初始值,可以是十六进制也可以是十进制,甚至还可以是 0-1 字符串。
- 1 string str("11111");
- 2 bitset<10> a(10);
- 3 //将a初始化为000001010
- 4 bitset<10> e(0xff);
- 5 //将e的后8位初始化为1
- 6 bitset<10> f(str);
- 7 //将f的后5位初始化为1
- 8 bitset<10> d;
- 9 //无参数时每位都初始化为0
2.位操作成员函数
1.text(pos)
功能:测试 pos 为是否为1,是返回 1,不是返回 0。
2.any()
功能:测试所有位是否为 0 ,是返回0,不是返回1。
3.none()
功能:测试是否所有位为 0 ,是返回1,不是返回0.
4.count()
功能:统计位为 1 的个数并返回。
5.size()
功能:求取对象的大小(这里指的是位数)并返回。
6.flip(pos)
功能:将 pos 为翻转,即 0-1 变换,当无参时,则翻转所有位。
7.set(pos)
功能:将 pos 位置 1,当无参时,将所有位置 1 。
8.reset(pos)
功能:将 pos 为置 0 ,当无参时则将所有位置 0 。
示例:
- 1 bitset<10> a(10);
- 2 cout<<a<<endl;
- 3 cout<<a.test(1)<<endl;
- 4 cout<<a.any()<<endl;
- 5 cout<<a.none()<<endl;
- 6 cout<<a.count()<<endl;
- 7 cout<<a.size()<<endl;
- 8 a.set();
- 9 cout<<a<<endl;
- 10 a.reset();
- 11 cout<<a<<endl;
- 12 a.flip();
- 13 cout<<a<<endl;
程序运行结果:
- 1 0000001010
- 2 1
- 3 1
- 4 0
- 5 2
- 6 10
- 7 1111111111
- 8 0000000000
- 9 1111111111
值得注意的是:对某个对象的位可以像数组那样进行下标访问,并且还可以修改其 0-1 标志,如下修改对象的第 6 位并分别打印出各位:
- 1 bitset<10> a(10);
- 2 a[5] = 1;
- 3 for(int i = 0;i<10;i++)
- 4 cout<<a[i]<<"";
3.转换成员函数
bitset 对一个数进行了二进制位的操作,即将某个数转换成了二进制形式,并对二进制的某些位进行了操作(还有 0-1 字符串),那么如果我们需要用到修改了某个二进制位的数(0-1字符串)时,则需要通过转换函数来实现。
1.to_ulong()
功能:将对象以 unsigned long 类型返回,若对象经过了位操作函数的修改,则返回修改后的值。
2.to_string()
功能:将对象以 0-1 字符串的形式返回,若对象经过了修改,则返回修改后的值。如下代码输出为:10 0000001010 。
- 1 bitset<10> a(10);
- 2 int data = a.to_ulong();
- 3 string str = a.to_string();
- 4 cout<<data<<""<<str;
注意:bitset 对象只接受整型数据,如果初始化一个带有小数的数时,将自动截断,取整数部分进行操作。