在C++中,位集代表0或1的一些位值的固定序列。0表示值为false或unset,而1表示值为true或set。为了创建整数或字符串的位集,位集类提供了构造函数。位集的大小在编译时确定。
换句话说,bitset用于将所有位固定为1。如果只传递一个参数,则在该索引处分配该位。
位集是布尔的数组。并非每个布尔值都需要单独存储。相反,bitset被用来优化每一个布尔值所占用的空间,即1个空间或一个位。必须注意的是,位集占用的空间应该小于bool[n]和vector[n]。
由于位集以压缩的方式存储相同的信息,因此位集运算比数组和向量运算快。我们可以使用数组索引运算符[]单独访问位集的每个位,即bs[3]显示位集bs的索引3处的位,就像一个简单的数组一样。记住,对于10110,位集开始向后索引,0在第0和第3个索引处,而1在第1、第2和第4个索引处。
位集遵循压缩方式来存储相同的操作,以比数组或向量执行得更快。通过使用索引运算符[],可以很容易地在数组中访问它们。但是,需要注意的是,位集从相反的方向(即向后)开始索引。例如,101110被计入第0和第3个索引,而第1和第2个索引被计入1。
要使用整数和二进制字符串构造位集,我们可以通过在编译时固定位集大小来使用构造函数,这样在运行时它就不会被更改。
我们可以通过构造函数使用整数和二进制字符串构造一个位集,如下代码所示。位集的大小在编译时是固定的,也就是说,不能在运行时更改。
与bitset类相关的主要函数有size、reset、set等等。让我们通过代码示例来形象化这一点。
<bitset>头文件中使用的语法。
template <size_t N> class bitset;
Example code:
#include<iostream>
#include<bitset>
using namespace std;
int main ()
{
bitset<20> fool(200);
bitset<20> bark(0xfa2) ;
bitset<20> buzz (string("0101111001"));
cout << "fool: " << fool << '\n';
cout << "bark: " << bark << '\n';
cout << "buzz: " << buzz << '\n';
return 0;
}
输出
解释:
在上面的代码中,函数bitset是从头文件<bitset>导入的。位集函数主要传递三个参数,如整数、二进制地址和一串数字。这3个参数的大小为2o,可以从整数值为200打印的输出中看出。位集bark的二进制值被取为(0xfa2:某个值),并定义了字符串。
对于所有参数,与输入相对应的输出最多打印20位小数。
现在让我们借助下面的参考表来看看与位集操作相关的不同函数。
Member Types (constructors,functions, operators) |
Methods and Description |
reference |
用于表示对位的引用的代理类。 |
constructor |
构造位集容器并为int、string等初始化它。 |
operators |
执行诸如AND、OR、NOT、XOR、左移、右移等操作。 |
all() |
测试是否设置了所有或至少一个位。 |
count() |
统计位集中的集合数。 |
none() |
检查位是否未设置。 |
flip() |
切换单个或所有位集。 |
set() |
将所有位设置为1。 |
reset() |
将所有位设置为0。 |
hash() |
返回位集提供的哈希值。 |
string() |
这会将位对象转换为字符串对象。 |
test() |
检查是否设置了第n位。 |
ullong() |
将位转换为long或unsigned long。 |
使用位集的优点:
位集以压缩的方式存储,因此与数组或向量相比,访问速度更快。
我们可以很容易地将位集与构造函数一起使用,这使得整型和二进制字符串等数据类型的构造更容易。
位集大小在编译时是固定的,因此我们不需要在运行时这样做,这节省了时间。
位集是动态可调的,因此阵列大小可以根据需要增加。