目录
前言
通常我们是使用的数据类型都是以字节为单位的,bitset中的一个元素一般只占1 bit,相当于一个char元素所占空间的八分之一,int的三十二分之一,特定的情况可以节约大量内存空间,另外完美支持了各种运算操作。下面,就让我们来仔细研究有关bitset的相关知识吧!
1.声明一个该类型变量
首先是头文件问题,bitset有一个专属的头文件:
#include<bitset>
当然也可以用万能头文件#include<bits/stdc++.h>哈。
接下来就是声明问题了。
通常采用这种声明方式(n为bitset在内存中占的位数):
bitset<n>bt;
这种方法默认初始值为0。
最后是赋值问题 。
bitset的赋值可谓是五花八门,在这里,给大家列举2种常见的赋值方式:
1.这是二进制赋值方式,由系统将n转为二进制后赋值进bitset中。
bitset<n>bt(1234);
2.这是字符串赋值方式,由系统直接将字符串赋值进bitset中。
bitset<n>bt(string("字符串"));
当然还有十六进制赋值等一系列其他方法,在这里就不展示了。
2.相关函数
bt.any() | b中是否存在置为1的二进制位? |
bt.none() | b中不存在置为1的二进制位吗? |
bt.count() | b中置为1的二进制位的个数 |
bt.size() | b中二进制位的个数 |
bt[pos] | 访问b中在pos处的二进制位 |
bt.test(pos) | b中在pos处的二进制位是否为1? |
bt.set() | 把b中所有二进制位都置为1 |
bt.set(pos) | 把b中在pos处的二进制位置为1 |
bt.reset() | 把b中所有二进制位都置为0 |
bt.reset(pos) | 把b中在pos处的二进制位置为0 |
bt.flip() | 把b中所有二进制位逐位取反 |
bt.flip(pos) | 把b中在pos处的二进制位取反 |
bt.to_ulong() | 用b中同样的二进制位返回一个unsigned long值 |
os << bt | 把b中的位集输出到os流 |
3.用法
bitset的用法其实很简单,位运算也和正常的一样。
bitset<4>bt1(string("1001"));
bitset<4>bt2(string("0011"));
cout<<(bt1^=bt2)<<endl; // 1010 (bt1对bt2按位异或后赋值给bt1)
cout<<(bt1&=bt2)<<endl; // 0010 (按位与后赋值给bt1)
cout<<(bt1|=bt2)<<endl; // 0011 (按位或后赋值给bt1)
cout<<(bt1<<=2)<<endl; // 1100 (左移2位,低位补0,有自身赋值)
cout<<(bt1>>=1)<<endl; // 0110 (右移1位,高位补0,有自身赋值)
cout<<(~bt2)<<endl; // 1100 (按位取反)
cout<<(bt2>>1)<<endl; // 0001 (右移,不赋值)
cout<<(bt1==bt2)<<endl; // (0)false (0110==0011为false)
cout<<(bt1!=bt2)<<endl; // (1)true (0110!=0011为true)
cout<<(bt1&bt2)<<endl; // 0010 (按位与,不赋值)
cout<<(bt1|bt2)<<endl; // 0111 (按位或,不赋值)
cout<<(bt1^bt2)<<endl; // 0101 (按位异或,不赋值)