提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- bitset的介绍
- 位图的引入
- 位图的概念
- 位图的应用
- bitset的使用
- bitset的定义方式
- bitset的成员函数
- bitset运算符的使用
- 如有错误,多多指教!
bitset的介绍
如果有40亿个不重复的无符号的整数,乱序,给出一个无符号的整数,如果快速判断那个数是否在这其中呢?
1.要判断一个数,无非就是把这些数排序,然后二分查找
2.或者是放入unordered_set容器中,然后使用find查找
这两种方法前者的效率是O(NlogN) 后者是O(lN)
但是麻烦的就是这40亿个数,我们必须要将这些数全部保存到内存当中去,这就要消耗大约16G的内存,空间消耗太大了,单从空间消耗上去看这两种方法都是不可行的。
所以就要用到了位图
位图的引入
无符号整数的个数是2^32
就需要2^32个比特位,才占内存512M的内存空间,相比较与16G大大缩小了,所以空间效率达到质的飞跃
位图的概念
位图,就是每一个比特位来存放某一状态,适用于海量的数据,以及无重复数据的场景。通常是用来判断某一数据是否存在.
位图的应用
常见的位图的应用如下:
1.快速查找某一个数据是否在某个集合中
2.排序
3.求两个集合的交集或者并集等等
4.操作系统中磁盘块标记
5.内核中信号标志位(信号屏蔽字和未决信号等等)
bitset的使用
bitset的定义方式
方式一:bitset<8> ag;//00000000
构造一个8位的位图,所有位都初始化为0
方式二:bitset<8> ag(2);//00000010
构造一个8位的位图,所有位构成初始化为2
方式三:bitset<8> ag(string("10101010")
构造一个8位的位图,所有位根据string的0/1序列初始化位图的前n位, string的size比bitset的size小,就前面补0,大就取前bitset.size位
bitset的成员函数
bitset运算符的使用
使用示例:
#include<bitset> //使用位图头文件
//位图的介绍与使用
void test01()
{
bitset<8> bs;//设置8位的位图 00000000全部初始化为0
bs.set(2);// 从右往左数第二位为1 下标从0开始
bs.set(4);//第四位设置为1
cout << bs << endl;//00010100
bs.flip();//将所有位都翻转 11101011
cout << bs << endl;
cout << bs.count() << endl;//输出多少位是1的个数 6
cout << bs.test(3) << endl;//输出第三位是什么0/1 1
bs.reset(0);//清空第0位
cout << bs << endl;//11101010
cout << bs.size() << endl;//输出有多少位位图 8
bs.reset();//将所有位都清空 00000000
cout << bs.none() << endl;//如果没有位被设置了,就返回1 1
bs.set();//设置所有的位置 全部位都为1 11111111
cout << bs.all() << endl;//如果所有的位都被设置了,就返回1 1
}
//bitset运算符的使用
void test02()
{
//1.对于>>,<<运算符的使用
bitset<8> ag;
cin >> ag; //输入10101010
cout << ag << endl;//10101010
//2.=、==、!=、&=、|=、^=、<<=、>>=、~ 的使用
bitset<8> ag1(string("10101000"));
bitset<8> ag2(string("10101000"));
ag1 >>= 1; //ag1向右移动一个bit
cout << ag1 << endl;//01010101
ag2 |= ag1; //10101010 | 01010101
//10101010
//01010101
//11111111
cout << ag2 << endl;//11111111
//3.bitset位运算符的使用 & | ^
bitset<8> bs1(string("11101000"));
bitset<8> bs2(string("00010111"));
cout << (bs1 & bs2) << endl;//00000000
cout << (bs1 | bs2) << endl;//11111111
cout << (bs1 ^ bs2) << endl;//00000000
//4.bitset中[]运算符的使用
bitset<4> p1(string("1011"));
cout << p1[0] << endl;//1
p1[1] = 0;//1001
cout << p1 << endl;//1001
}
int main()
{
test01();
test02();
return 0;
}