bitset知识点整理总结
目录
- bitset是什么?
- 变量声明及成员函数
- 运算
bitset是什么
emm,这个嘛。我们还是从名字入手。bitset
->bit set
那就是一个存储bit
的set
喽。这话对,但也不完全对,更准确地说:它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。再换句话说:该类模拟一个bool元素数组,但针对空间分配进行了优化:通常,每个元素只占用一bit(在大多数系统上,这比最小的元素类型char
还要少八倍!)。
bitset是一个01串,每一位占一个bit,可以进行单点0/1修改,左移右移以及按位运算操作。一个非常好用的用法是统计某个数是否出现过,类似一个桶。同时两个bitset取或可以在优秀的复杂度下获得两个集合是否有重复元素的信息。
与数组相同的,bitset
中每个位的位置都可以单独访问:例如,对于名为BitSet
的给定位集,表达式BitSet[3]
访问其第四位,就像常规数组访问其元素一样。
变量声明及成员函数
声明与初始化
头文件
使用bitset
需要包含#include <bitset>
头文件
声明
用法(格式):
bitset<长度> 名称
初始化
bitset
在全局变量中定义时自动将每一位都赋值为0,或者也可以手动给它一个初始值,他既可以接受一个整型变量,也可以接受一个01串。但初始值为整形时,他将自动储存变量的二进制形式(多余的位数储存为0),而01串能够直接储存。
用法(格式):bitset<长度> 名称(string类型的01串 或 整形变量)
bitset<10> s1(9);
//将9转为2进制存储并补足位数,即0000001001
bitset<10> s2( string("1001") )
//上下两种方式等价
需要特别注意的是,集合内部的下标是从右向左单调递增的,即倒序储存的,所以在bitset
内部,刚刚的9
并不是以0000001001
的方式存储的,而是以1001000000
的方式存储的。
成员函数
重置 reset
这个函数的功能就是将一个已经定义好的bitset
重置,也可以理解为清空,即将bitset
的每一位都变为0
用法(格式):名称.reset()
设置 set
我也不知道它的中文名字到底叫啥,他的功能刚好与reset
不同,或者说是更高级一些
他的用法有以下几种:
bitset<8> Bitset (string("10011011"));
//随便定义一个bitset
//1.set函数不指定参数时,将bitset的每一位全部置为1
cout << Bitset.set() << endl; //11111111
//2.set函数指定两位参数时,将第一参数位的元素置为第二参数的值,本行对Bitset的操作相当于Bitset[3]=0
cout << Bitset.set(3,0) << endl; //11110111
//3.set函数只有一个参数时,将参数下标处置为1
cout << Bitset.set(3) << endl; //11111111
测试(查找)test
这个函数用处也是很大的,它只有一个参数,表示所要查找的位置,由一个整型变量表示(bitset
是没有迭代器的好耶),而他的返回值便是查找位置的值。
用法(格式):名称.test(位置)
同样需要注意,bitset
内部是倒序存储的,所以查看是也是反的。
bitset<5> Bitset(string("01011"));
for (int i = 4; i >= 0; i--) {
cout << Bitset.test(i);
}
存在1? any
实在不知道应该起什么名字了咳咳,他的名字就是他的用途,问一问电脑,这个bitset
里面有没有1
?返回一个bool
类型的值,即如果存在1
返回true
不存在返回false
用法(格式):名称.any()
存在0? none
与上一个any
刚好相反,他是去问,这个bitset
里面有没有0
?
用法(格式):名称.none()
多少1? count
起名愈加简单粗暴如名:数一数bitset
里到底有几个1
?
可惜的是,bitset
中没有数0
的函数,但是问题不大,位数-1的个数
就好喽~
用法(格式):名称.count()
取反 flip
和他的名字一样,他的用处就是将bitset
中所有的0
变成1
而所有的1
变成0
,即取反
使用时,你可以选择传入一个整数作为参数,也可以什么也不给他:
用法(格式):名称.flip( /*位置*/ )
bitset<5> Bitset(string("01011"));
Bitset.flip(1);
//如果传入一个整数,它便会将这一位上的数取反(倒序存储不能忘!)
//"01001"
Bitset.flip();
//如果不传入任何参数,便会将所有数取反
//"10110"
类型转换函数
bitset
还有一个强大的功能就是将自己的类型改变(我嫌弃我自己),它能将自己所存储的内容变成一个字符串或整数:
to_string
它的功能便是将bitset
变为一个由0
和1
构成的string
类型的字符串(01串)。
用法(格式):名称.to_string()
bitset<5> Bitset(string("01011"));
cout << Bitset.to_string() << endl;
//输出:01011
string s = Bitset.to_string();
cout << s << endl;
//也可以存储成字符串
//输出:01011
to_ulong
它则是能够将bitset
中存储的数据变为一个unsigned long int
类型的十进制数,这正是利用了bitset
存储无符号二进制数的性质。
用法(格式):名称.to_ulong()
bitset<5> Bitset(string("01011"));
cout << Bitset << endl;
cout << Bitset.to_ulong() << endl;
//输出:11
unsigned long int s = Bitset.to_ulong();
cout << s << endl;
//输出:11
运算
bitset
作为一个能够存储二进制的类型,他当然也支持二进制的运算 。写法与整形类似。
比如:
bitset<N> k = s << x;
bitset<N> k = s & s0;
//N为bitset的位数
//x是一个整数表示移位的位数
//s,s0均为bitset类型
尾声
这期鸽了相当长的时间呢高中知识好难QAQ,以后更新速度未必比这个快......
有问题和错误可以在评论区告诉我~
我可能不会,但我可以学!
然后......
求个点赞收藏关注吧QAQ这是孩子的动力!
催更
~~~~~~~~~写的很好,谢谢,又介绍了有个我不知道的知识。已收藏~
## 感谢资瓷~
%%%差点错过了hh
# 感谢资瓷!