C++:位图
C++:位图
- bitset的介绍
- 位图的引入
- 位图的概念
- 位图的应用
- bitset的使用
- bitset的定义方式
- bitset成员函数的使用
- bitset运算符的使用
- 总结
代码链接:https://gitee.com/hu_yuchen/code/tree/master/C+±Review/4.STL/bitset
bitset的介绍
bitset
是C++标准模板库(STL)中的一个类,用于操作固定大小的位序列(即位图)。它提供了高效的方式来存储和操作位信息,特别适用于需要处理大量数据且数据状态只有两种(如存在/不存在)的场景。
位图的引入
给定40亿个不重复的无符号整数,如何快速判断一个数是否在这些数中。传统的排序加二分查找或使用unordered_set
的方法虽然时间效率高,但在空间上不可行,因为40亿个整数会占用大量内存(约16GB)。而使用位图的方式,只需要用一个比特位来表示每个数字是否存在,大大减少了内存消耗。
位图的概念
位图是一种数据结构,使用每一位来存储某种状态(如存在或不存在)。它适用于海量数据且数据无重复的场景,主要用于快速判断某个数据是否存在于一个集合中。
位图的应用
位图的常见应用场景包括:
- 快速查找某个数据是否在一个集合中。
- 排序。
- 求两个集合的交集、并集等。
- 操作系统中磁盘块标记。
- 内核中信号标志位(信号屏蔽字和未决信号集)。
bitset的使用
bitset
的定义方式、成员函数和运算符的使用。
bitset的定义方式
- 方式一 :构造一个固定大小的位图,所有位初始化为0。
bitset<16> bs1; // 0000000000000000
- 方式二 :根据给定的值初始化位图的前n位。
bitset<16> bs2(0xfa5); // 0000111110100101
- 方式三 :根据字符串中的0/1序列初始化位图的前n位。
bitset<16> bs3(string("10111001")); // 0000000010111001
bitset成员函数的使用
bitset
类提供了多种成员函数,用于操作和查询位图:
set
:设置指定位或所有位。reset
:清空指定位或所有位。flip
:反转指定位或所有位。test
:获取指定位的状态。count
:获取被设置位的个数。size
:获取可以容纳的位的个数。any
:如果有任何一个位被设置则返回true
。none
:如果没有位被设置则返回true
。all
:如果所有位都被设置则返回true
。
使用示例:
#include <iostream>
#include <bitset>
using namespace std;int main() {bitset<8> bs;bs.set(2); // 设置第2位bs.set(4); // 设置第4位cout << bs << endl; // 00010100bs.flip(); // 反转所有位cout << bs << endl; // 11101011cout << bs.count() << endl; // 6cout << bs.test(3) << endl; // 1bs.reset(0); // 清空第0位cout << bs << endl; // 11101010bs.flip(7); // 反转第7位cout << bs << endl; // 01101010cout << bs.size() << endl; // 8cout << bs.any() << endl; // 1bs.reset(); // 清空所有位cout << bs.none() << endl; // 1bs.set(); // 设置所有位cout << bs.all() << endl; // 1return 0;
}
bitset运算符的使用
bitset
类重载了多种运算符,方便对位图进行操作:
- 位移运算符(
>>
、<<
) :
bitset<8> bs;
cin >> bs; // 输入位图
cout << bs << endl; // 输出位图
- 赋值运算符(
=
)、关系运算符(==
、!=
)、复合赋值运算符(&=、|=、^=、<<=、>>=
)、单目运算符(~
) :
bitset<8> bs1(string("10101010"));
bitset<8> bs2(string("10101010"));
bs1 >>= 1;
cout << bs1 << endl; // 01010101bs2 |= bs1;
cout << bs2 << endl; // 11111111
- 位运算符(
&
、|
、^
) :
bitset<8> bs1(string("10101010"));
bitset<8> bs2(string("01010101"));
cout << (bs1 & bs2) << endl; // 00000000
cout << (bs1 | bs2) << endl; // 11111111
cout << (bs1 ^ bs2) << endl; // 11111111
- 下标运算符(
[]
) :
bitset<8> bs(string("00110101"));
cout << bs[0] << endl; // 1
bs[0] = 0;
cout << bs << endl; // 00110100
总结
bitset
是一个非常强大的工具,特别适用于需要高效存储和操作位信息的场景。通过位图的方式,可以大大减少内存消耗,同时提供快速的查询和操作能力。