返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++位图怎么实现
  • 884
分享到

C++位图怎么实现

2023-06-15 07:06:00 884人浏览 安东尼
摘要

这篇文章给大家分享的是有关c++位图怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概念位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据

这篇文章给大家分享的是有关c++位图怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

概念

位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据。通常是用来判断某个数据存不存在的

例如:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中

如果不看数据量,我们第一想到的肯定就是依次从头遍历,但是这个数据量是非常大的,有40亿,遍历40亿次消耗的时间和内存是非常多的。但是引入位图后,就可以专门解决这种大量数据查找是否存在的问题。查找这个数是否存在所消耗的时间复杂度为O(1),且节省了32倍的容量(下面有解释)。下面我们一起来看看位图的原理及代码实现

原理

查找一个数是否存在,其实答案就是存在或者不存在,这种只需要回答是与否的问题,我们都可以用二进制中的位来表示,1表示该数存在,反之0表示该数不存在。而位图中的每个数据单元都是一个bit位,这样子平时我们都要话32位4字节来存储数据,而现在我们只需要花1个字节就能“存储数据”,在空间上减少了约32倍的容量。例如40G的数据我们只要花1.3G来存储。但是我们平时操作的数据类型最小就是一个字节,我们不能直接对位进行操作,所以我们可以借助位运算来对数据进行操作。下面我们来看看数据在位图中是如何存储的

我们这里给出一个数组

int arr[] = {1,2,4,5,7,10,11,14,16,17,21,23,24,28,29,31};则我们只需要花1个字节来存这些数据

C++位图怎么实现

解释:我们目前很多的机器都是小端存储,也就是低地址存低位,一个整形数据中,第一个字节用来存储0-7的数字,第二个字节用来存储8-15的数字,第三个字节用来存储16-23的数字,第四个字节用来存储24-31的数字。我们来看看数字10是如何存储的。先通过模上32,取余还是10,然后再将4字节中第10个比特位置为1,则表示该数字出现过。由于我们的机器是小端存储,所以我们的每个比特位都是要从右边开始计算的,如下图

C++位图怎么实现

所以说我们只需要将对应的比特位置为1即可。但是如果我们要存储的数据很大呢?其实也很简单,我们可以定义一个数组,当做一个位图,如果该数字在0-31之间,我们就存储在0号下标的元素中进行操作,如果在32-63之间,则就在1号下标之间进行操作。计算下标我们可以通过模32来获得下标。

我们知道位图的原理后,我们在通过原理来用代码实现一个位图吧

实现

成员变量和构造函数:在实现位图中,我们的成员变量只需要一个数组就可以实现。而这个数组有多我们要开多大呢?数组多开一个整形空间,就能多存32个数字,所以我们可以让用户提供一个准确的数,这个数是一个数据量,也是数的最大范围。我们可以通过该数模上32,就可以获得该数组的大小,但是0~31模上32为0,我们开0个空间那显然不合适,所以我们要开range/32 + 1个空间大小的数组

存储数据:存储一个数字num需要3个步骤,第一是需要计算出该值对应的数组下标。计算数组下标方式为idx=num / 32;第二步是计算num在对应整数的比特位的位置bitIdx=num%32;第三步是要将计算出来的bite位置为1。我们之前说过,要操作位,我们可以通过位运算来操作,可以先将1左移bitIdx位后再和整数进行或运算

例如假设bitIdx=5,数据为10010011

将1进行左移5位==>100000

将数据和第一步计算出来的结果进行或运算

10010011 | 100000 =10110011,此时我们就将指定位置置位1了

查找数据:要判断一个数据是否存在,其实和存储数据是类似,也是需要计算出两个位置idx和bitIdx。然后通过这两个位置来判断对应位置是否为1,为1则表示该数字存在。如何判断呢?我们可以先将数组下标为idx的整数向右移bitIdx位,然后再和1进行与运算,如果为1则表示存在,否则不存在

例如假设bitIdx=5,数据为10110011

将数据进行右移5位00000101

将第一步计算出来的结果和1进行与运算

00000101 & 1 = 1,此时表示该数字存在,返回true

删除数据:删除数据和存储数据操作一样,唯一的区别就是将对应的bit位置为0。我们可以通过先将1进行左移bitIdx位,然后取反,将结果再和原来数据进行与运算

例如假设bitIdx=5,数据为10110011

将1进行左移5位后并取反011111

将第一步计算出来的结果和数据进行与运算

10110011 & 011111 = 10010011,删除成功

代码:

class BitMap{public://位图的内存大小和数据范围有关BitMap(size_t range):_bit(range / 32 + 1){}void set(const size_t num){//计算数组中的下标int idx = num / 32;//计算num在对应下标整数中的下标位置int bitIdx = num % 32;//将对应的比特位置1_bit[idx] |= 1 << bitIdx;}bool find(const size_t num){int idx = num / 32;int bitIdx = num % 32;return (_bit[idx] >> bitIdx) & 1;}void reset(const size_t num){int idx = num / 32;int bitIdx = num % 32;_bit[idx] &= ~(1 << bitIdx);}private:vector<int> _bit;};

测试截图:

C++位图怎么实现

感谢各位的阅读!关于“C++位图怎么实现”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: C++位图怎么实现

本文链接: https://lsjlt.com/news/278599.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++位图怎么实现
    这篇文章给大家分享的是有关C++位图怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概念位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据...
    99+
    2023-06-15
  • C语言中位图怎么实现
    这篇文章主要介绍C语言中位图怎么实现,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本文实例为大家分享了C语言位图及位图的实现具体代码,供大家参考,具体内容如下1.概念位图(bitset)是一种常用的数据结构,常用在给...
    99+
    2023-06-15
  • C++ 位图及位图的实现原理
    概念 位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据。通常是用来判断某个数据存不存在的 例如:给40亿个不重复...
    99+
    2024-04-02
  • C语言位图及位图的实现
    本文实例为大家分享了C语言位图及位图的实现具体代码,供大家参考,具体内容如下 1.概念 位图(bitset)是一种常用的数据结构,常用在给一个很大范围的数,判断其中的一个数是不是在其...
    99+
    2024-04-02
  • C++中位图的实现示例
    这篇文章主要介绍C++中位图的实现示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概念位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据。通常是用...
    99+
    2023-06-15
  • 使用C++实现位图处理
    目录位图的引入什么是位图位图的应用bitset的使用定义方式成员函数bitset的运算符重载赋值-关系-复合赋值-单目运算符[]重载位图的引入 无序的40亿个不重复的无符号整数,给一...
    99+
    2023-05-16
    C++位图处理 C++位图操作
  • css精灵图怎么实现定位
    本篇内容主要讲解“css精灵图怎么实现定位”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css精灵图怎么实现定位”吧!精灵图利用background-image,background-repea...
    99+
    2023-07-04
  • C++位图的实现原理与方法
    概念 位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据。通常是用来判断某个数据存不存在的 例如:给40亿个不重...
    99+
    2024-04-02
  • C++怎么实现群组错位词
    本篇内容介绍了“C++怎么实现群组错位词”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! Group Anagrams 群组错位词G...
    99+
    2023-06-20
  • C#怎么实现获取Excel中图片所在坐标位置
    本文小编为大家详细介绍“C#怎么实现获取Excel中图片所在坐标位置”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么实现获取Excel中图片所在坐标位置”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。【程序...
    99+
    2023-06-30
  • java地图定位功能怎么实现
    要实现Java地图定位功能,可以使用以下步骤:1. 使用Java地图库,如Google Maps API、Baidu Maps AP...
    99+
    2024-02-29
    java
  • c++保留有效位数怎么实现
    在C++中,可以使用std::setprecision函数来控制输出的有效位数。该函数位于头文件中。以下是一个示例代码: #incl...
    99+
    2023-10-23
    c++
  • C#怎么实现拼图游戏
    这篇文章主要介绍“C#怎么实现拼图游戏”,在日常操作中,相信很多人在C#怎么实现拼图游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#怎么实现拼图游戏”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!本文...
    99+
    2023-06-20
  • Python怎么实现位图分割的效果
    这篇文章主要讲解了“Python怎么实现位图分割的效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python怎么实现位图分割的效果”吧!话不多说,直接来代码。import cv...
    99+
    2023-06-25
  • Python中怎么实现一个位图索引
    Python中怎么实现一个位图索引,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。class Bitmap(object):def __ini...
    99+
    2023-06-02
  • C#算法中怎么实现各位相加
    本文小编为大家详细介绍“C#算法中怎么实现各位相加”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#算法中怎么实现各位相加”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。各位相加给定一个非负整数 num...
    99+
    2023-06-26
  • C语言实现24位彩色图像二值化
    本文实例为大家分享了C语言实现24位彩色图像二值化的具体代码,供大家参考,具体内容如下 // huiduhua.cpp : 定义控制台应用程序的入口点。 // #includ...
    99+
    2024-04-02
  • Android Bitmap Monitor图片定位功能怎么实现
    本篇内容介绍了“Android Bitmap Monitor图片定位功能怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有...
    99+
    2023-07-05
  • C#怎么实现树形图列表
    这篇“C#怎么实现树形图列表”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#怎么实现树形图列表”文章吧。效果代码publi...
    99+
    2023-07-04
  • C#实现获取Excel中图片所在坐标位置
    目录程序环境获取图片所在行、列位置实现代码C#vb.net本文以C#和vb.net代码示例展示如何来获取Excel工作表中图片的坐标位置。这里的坐标位置是指图片左上角顶点所在的单元格...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作