当前位置: 首页 > java >正文

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 <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类重载了多种运算符,方便对位图进行操作:

  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; // 01010101bs2 |= 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是一个非常强大的工具,特别适用于需要高效存储和操作位信息的场景。通过位图的方式,可以大大减少内存消耗,同时提供快速的查询和操作能力。

http://www.xdnf.cn/news/2220.html

相关文章:

  • 【Charles】抓包工具安装配置unknown问题解决
  • 《人件》第三章 正确的人
  • 在Windows11中配置Git+SSH环境,本此实践使用Gitee(码云),方法同样适用于其它绝大部分Git服务
  • Linux-进程控制
  • 安服实习面试面经总结(也适合hvv蓝初)
  • Linux渗透测试
  • x修改ssh版本号9.9可以躲过漏洞扫描器扫描
  • JAVA---字符串
  • 通过门店销售明细表用SQL得到每月每个门店的销冠和按月的同比环比数据
  • 可视化性能分析工具火焰图
  • function,bind,lambda的用法
  • Claude系列模型-20250426
  • Android12源码编译及刷机
  • JavaWeb——案例(14/x)- 文件上传-阿里云OSS-准备(阿里云 OSS 简介、使用阿里云 OSS 的流程、关键准备工作)
  • 【含文档+PPT+源码】基于Django框架的乡村绿色农产品交易平台的设计与实现
  • DeepSeek预训练追求极致的训练效率的做法
  • 【分布式系统中的“瑞士军刀”_ Zookeeper】二、Zookeeper 核心功能深度剖析与技术实现细节
  • 818协议知识笔记
  • ShaderToy学习笔记 03.多个形状和旋转
  • DHCP配置文件详解
  • 解决conda虚拟环境安装包却依旧安装到base环境下
  • AEB法规升级后的市场预测与分析:技术迭代、政策驱动与产业变革
  • 链接文件及功能安全:英飞凌官方文档摘录 - 基于Tasking与AURIX TC3xx MCAL中Link文件解析以及代码变量定位方法详解
  • C++学习:六个月从基础到就业——STL:分配器与设计原理
  • 一种滑窗像素自差值的深度学习损失函数
  • MySQL主从数据库配置教程
  • 谈谈关于【枚举】类型变量的好处
  • ARM架构的微控制器总线矩阵优先级与配置
  • SpringMVC
  • OpenFeign 日志配置