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)。而使用位图的方式,只需要用一个比特位来表示每个数字是否存在,大大减少了内存消耗。

位图的概念

位图是一种数据结构,使用每一位来存储某种状态(如存在或不存在)。它适用于海量数据且数据无重复的场景,主要用于快速判断某个数据是否存在于一个集合中。

位图的应用

位图的常见应用场景包括:

  1. 快速查找某个数据是否在一个集合中。
  2. 排序。
  3. 求两个集合的交集、并集等。
  4. 操作系统中磁盘块标记。
  5. 内核中信号标志位(信号屏蔽字和未决信号集)。

bitset的使用

bitset的定义方式、成员函数和运算符的使用。

bitset的定义方式
  1. 方式一 :构造一个固定大小的位图,所有位初始化为0。
bitset<16> bs1; // 0000000000000000
  1. 方式二 :根据给定的值初始化位图的前n位。
bitset<16> bs2(0xfa5); // 0000111110100101
  1. 方式三 :根据字符串中的0/1序列初始化位图的前n位。
bitset<16> bs3(string("10111001")); // 0000000010111001
bitset成员函数的使用

bitset类提供了多种成员函数,用于操作和查询位图:

  • set:设置指定位或所有位。
  • reset:清空指定位或所有位。
  • flip:反转指定位或所有位。
  • test:获取指定位的状态。
  • count:获取被设置位的个数。
  • size:获取可以容纳的位的个数。
  • any:如果有任何一个位被设置则返回true
  • none:如果没有位被设置则返回true
  • all:如果所有位都被设置则返回true

使用示例:

#include 
#include 
using namespace std;

int main() {
    bitset<8> bs;
    bs.set(2); // 设置第2位
    bs.set(4); // 设置第4位
    cout << bs << endl; // 00010100

    bs.flip(); // 反转所有位
    cout << bs << endl; // 11101011
    cout << bs.count() << endl; // 6

    cout << bs.test(3) << endl; // 1

    bs.reset(0); // 清空第0位
    cout << bs << endl; // 11101010

    bs.flip(7); // 反转第7位
    cout << bs << endl; // 01101010

    cout << bs.size() << endl; // 8

    cout << bs.any() << endl; // 1

    bs.reset(); // 清空所有位
    cout << bs.none() << endl; // 1

    bs.set(); // 设置所有位
    cout << bs.all() << endl; // 1
    return 0;
}
bitset运算符的使用

bitset类重载了多种运算符,方便对位图进行操作:

  1. 位移运算符(>><<) :
bitset<8> bs;
cin >> bs; // 输入位图
cout << bs << endl; // 输出位图
  1. 赋值运算符(=)、关系运算符(==!=)、复合赋值运算符(&=、|=、^=、<<=、>>=)、单目运算符(~) :
bitset<8> bs1(string("10101010"));
bitset<8> bs2(string("10101010"));
bs1 >>= 1;
cout << bs1 << endl; // 01010101

bs2 |= bs1;
cout << bs2 << endl; // 11111111
  1. 位运算符(&|^) :
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
  1. 下标运算符([]) :
bitset<8> bs(string("00110101"));
cout << bs[0] << endl; // 1
bs[0] = 0;
cout << bs << endl; // 00110100

总结

bitset是一个非常强大的工具,特别适用于需要高效存储和操作位信息的场景。通过位图的方式,可以大大减少内存消耗,同时提供快速的查询和操作能力。

你可能感兴趣的:(C++,c++,开发语言)