C++ BitSet
kelvin 发布于 2021-02-09

在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

构造位集容器并为intstring等初始化它。

operators

执行诸如ANDORNOTXOR、左移、右移等操作。

all()

测试是否设置了所有或至少一个位。

count()

统计位集中的集合数。

none()

检查位是否未设置。

flip()

切换单个或所有位集。

set()

将所有位设置为1

reset()

将所有位设置为0

hash()

返回位集提供的哈希值。

string()

这会将位对象转换为字符串对象。

test()

检查是否设置了第n位。

ullong()

将位转换为longunsigned long

注意:在C++语言中,BITScript库中仍然存在大量的函数。以上是最流行和常用的功能。


使用位集的优点:
位集以压缩的方式存储,因此与数组或向量相比,访问速度更快。
我们可以很容易地将位集与构造函数一起使用,这使得整型和二进制字符串等数据类型的构造更容易。
位集大小在编译时是固定的,因此我们不需要在运行时这样做,这节省了时间。
位集是动态可调的,因此阵列大小可以根据需要增加。

kelvin
关注 私信
文章
92
关注
0
粉丝
0