~这里我们来介绍一下bitset的用法~
bitset
首先我们了解一下什么是bitset:
①:C++语言的一个类库,用来方便地管理一系列的bit位而不用程序员自己来写代码。bitset除了可以访问指定下标的bit位以外,还可以把它们作为一个整数来进行某些统计。
②:大小可动态改变, 取值为true或false的位集合。用于表示一组bool标志。
它隶属于头文件
通常运用于压位,它占得空间非常小
bitset占用的空间确实会比使用bool型的数据小很多,但是其中确还是有些不明白的地方,为什么当我们只有一位的时候占用的字节数为4字节,如果按照不能跨界的原则的话也应该是1个字节或者两个字节,于是我查阅下相关资料,在bitset中计算其大小的时候并不是简单地不能跨界的原则,其是有一个计算规则的在32位机器上Size = 4 * ((N + 31) / 32)在64位机器上Size = 8* ((N + 63) / 64)这样我们就不难得到结果了,4*((1+31)/32) = 4,这样其实充分提高了内存的读写效率,确实是很聪明的作法。
但是bitset在定义变量时必须确定变量的大小,虽然说bitset也是一个容器,但是它并不像vector等容器那样可以动态增加容量,且其容量不能动态确定
列出了bitset的构造函数。类似于vector,bitset类是一种类模板;而与vector不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值:
bitset<32> bitvec; //32位,全为0。
bitset给出的长度值必须是常量表达式(2.7节)。正如这里给出的,长度值必须定义为整型字面值常量或是已用常量值初始化的整数类型的const对象。
这条语句把bitvec定义为含有32个位的bitset对象。和vector的元素一样,bitset中的位是没有命名的,程序员只能按位置来访问它们。位集合的位置编号从0开始,因此,bitvec的位序是从0到31。以0位开始的位串是低阶位(low-order bit),以31位结束的位串是高阶位(high-order bit)。
bitset用法
- bitset b :
b有n位,每位都为0 - bitset b(u):
b是unsignedlong型u的一个副本 - bitset b(s):
b是string对象s中含有的位串的副本 - bitset b(s, pos, n):
b是s中从位置pos开始的n个位的副本 - 在32位unsigned long的机器上,十六进制值0xffff表示为二进制位就是十六个1和十六个0(每个0xf可表示为1111)。可以用0xffff初始化bitset对象:
系统中的bitset函数
例如:
你在求一个数的二进制中有多少个1时,你可以先把它转化为bitset类型,再用bitset中函数count(),即可求解
bitset<1001>a;
int main(){
x=read();a=x;
printf("%d",a.count());
return 0;
}
set和reset操作分别用来对整个bitset对象的所有二进制位全置1和全置0:
bitvec.reset();
bitvec.set();
flip操作可以对bitset对象的所有位或个别位按位取反:
bitvec.flip(0);
bitvec[0].flip();
bitvec.flip();