【高效数据结构——位图bitmap】

2023-11-18

初识位图bitmap

位图(Bitmap)是一种用于表示和操作位(bit)的数据结构。它是由一系列二进制位(0 或 1)组成的序列,每个位都可以单独访问和操作。

位图常用于以下情况:

  • 压缩存储:位图可以有效地存储大量的布尔值信息,每个位只占用一个比特,因此可以大幅减少存储空间的占用。例如,当需要存储大量的开关状态、标志位或者布尔型数据时,使用位图可以节省内存。

  • 快速查找和查询:由于位图的特殊存储结构,它可以快速进行位的查找和查询。例如,可以用位图表示一组元素的存在与否,然后通过位运算来快速进行成员的查找、去重、交集、并集等操作。

  • 数据压缩和索引:位图可以用于压缩和索引数据,特别是在数据集合较小且有规律的情况下。例如,在数据库中,可以使用位图索引来加速数据的查询操作。

  • 布隆过滤器:布隆过滤器是一种基于位图的概率型数据结构,用于快速判断一个元素是否存在于一个集合中。它通过多个哈希函数和位图来判断元素的存在性,具有较低的空间占用和高效的查询速度。

在实现位图时,常用的数据结构有数组、位集合(bit set)或者使用整型数据类型(如整型数组、位域等)来表示。在现代编程语言中,也常常提供了专门的位图类或库,如 C++ 中的 std::bitset。

总结起来,位图是一种用于表示和操作位的数据结构,它可以节省存储空间、实现快速的位操作,并在许多领域中有着广泛的应用,包括存储、索引、查询、数据压缩等。

实现位图bitmap

#include <iostream>
#include <vector>
using namespace std;
class Bitmap {
private:
    std::vector<uint8_t> data; // 位图数据存储
    uint64_t size; // 位图大小(位数)

public:
    Bitmap(uint64_t bitmapSize) {
        size = bitmapSize;
        data.resize((size + 7) / 8, 0); // 位图数据初始化为0
    }

    void set(uint64_t index) {
        if (index >= size) {
            std::cout << "Index out of range." << std::endl;
            return;
        }
        uint64_t byteIndex = index / 8;
        uint8_t bitOffset = index % 8;
        data[byteIndex] |= (1 << bitOffset);
    }

    bool test(uint64_t index) {
        if (index >= size) {
            std::cout << "Index out of range." << std::endl;
            return false;
        }
        uint64_t byteIndex = index / 8;
        uint8_t bitOffset = index % 8;
        return (data[byteIndex] & (1 << bitOffset)) != 0;
    }
};
int main(){
    const uint64_t bitmapSize = 28; // 位图大小

    Bitmap bitmap(bitmapSize); // 创建位图

    // 设置一些位
    bitmap.set(0);
    bitmap.set(5);
    bitmap.set(10);
    bitmap.set(15);
    bitmap.set(18);

    // 测试位状态
    for (uint64_t i = 0; i < bitmapSize; i++) {
        std::cout << "Bit " << i << ": " << bitmap.test(i) << std::endl;
    }

    return 0;

}

c++提供的bitset

#include <iostream>
#include <bitset>

int main() {
    // 创建一个位图,表示 8 个标志位
    std::bitset<8> bitmap;

    // 设置第 2 位和第 5 位为 1
    bitmap.set(2);
    bitmap.set(5);

    // 输出位图的值
    std::cout << "Bitmap: " << bitmap << std::endl;

    // 获取第 3 位的值
    bool bit3 = bitmap.test(3);
    std::cout << "Bit 3: " << bit3 << std::endl;

    // 清除第 5 位
    bitmap.reset(5);

    // 输出位图的值
    std::cout << "Bitmap: " << bitmap << std::endl;

    // 获取位图的大小(位数)
    size_t size = bitmap.size();
    std::cout << "Bitmap size: " << size << std::endl;

    return 0;
}

github链接:https://github.com/mulinhu/CPPer/tree/main/util/bitmap_demo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【高效数据结构——位图bitmap】 的相关文章

  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • npm run dev 报错:missing script:dev

    报错信息 报错原因 package json 里面没有 scripts dev xxx 这段了 解决方法
  • 七牛云的使用(图片超详讲解)

    一 为什么要使用七牛云的OSS 对象存储服务 二 七牛云使用 登录七牛云官网 注册并认证 初次认证有30天免费使用权限 新建存储空间 点击创建的空间名字 进入 空间概括如下 阅读帮助文档 在自己的web应用中 使用七牛云对象存储服务OSS
  • 多态反射机制

    package duotai class Customer SuppressWarnings unused private String account SuppressWarnings unused private String pass
  • word怎么删除最后一页空白页

    1 将光标移动到最后一页的起始处 不停的按删除键 gt 我试了 无效 2 将光标定位在倒数第二页的末尾 直接按delete键进行删除 或者可以试试按住ctrl键再按delete键 gt 我试了 还是无效 3 将光标移动到最后一页 在菜单栏找
  • 答辩经验

    例举几个问题作为参考 给大家分析一些常见问题的回答注意点以及技巧 通过这几个问题的讲解告诉大家如何为答辩做准备 主要是讲一个方式方法 起一个抛砖引玉的作用 您了解之后可以针对自己的设计做相应的准备 1 你选这个课题的意义是什么呢 这个问题非
  • pandas 解决 A value is trying to be set on a copy of a slice from a DataFrame的问题

    stackoverflow 解决方案链接 https stackoverflow com questions 31468176 setting values on a copy of a slice from a dataframe rq
  • 微信小程序【发送给朋友】和【复制链接】功能,灰色不可用

    每日鸡汤 悲观者可能正确 但是乐观者往往成功 假设你是一个用户 你随便找一个小程序可以看到这几个功能 转发给朋友 分享到朋友圈 复制链接 很常见的功能 但是如果你作为开发者 这几个功能就需要自己做喽 并不是你项目建起来了就有的 1 转发给朋
  • 软实力-领导力

    领导力 领导力不是一蹴而就 需要不断训练和提炼 团队也是需要不断发展和规划 一个普通员工如何才能具备领导力呢 俗话说 天上不会掉馅饼 即使偶尔掉个馅饼下来 你的嘴也需要比别人的嘴张得大才能吃到 这 儿的嘴大可能包括你的能力和为这件事做的准备
  • echarts 图设置高度_Echarts 自适应宽高 vue

    思路 1 将图表包括在一个div中 该div设置了固定的宽高 可为百分比 2 由于不能直接设置rem进行适配 需要动态计算出 id chart 的高度 setChartHeight 根据自己需要调节图形大小 我的图形是放在 中 let ma
  • Golang获取当日00:00:00时间戳

    遇到好几次这个问题了 go的time里也没有这东西 百度也搜不到 很烦 干脆自己写一份 放到这里 year month day time Now Date location time LoadLocation Asia Shanghai 这
  • ESD 接触放电、空气放电

    1 接触放电主要针对的是半成品电子电气产品 或者是带金属外壳的成品 一般做接触放电主要是金属外壳 接触放电的放电头是尖头 2 空气放电主要是针对塑料外壳或者是金属外壳表面有绝缘漆的成品 空气放电的放电头是圆形头 3 一般接触放电或者空气放电
  • Python 之父 Guido van Rossum 称退休太无聊,正式加入微软搞开源!

    参考 https blog csdn net sinat 14921509 article details 109667079
  • 产品养成记

    参与感 pdf 从零开始做运营入门篇 张亮 pdf 结网 pdf 精益创业 pdf 区块链 定义未来金融与经济新格局 pdf 区块链 从数字货币到信用社会 pdf 人人都是产品经理 pdf 如何阅读一本书 pdf 上瘾 pdf 数据分析实战
  • 阿里云ACP级认证考试心得+过关经验

    正在准备阿里云ACP级认证考试的童鞋福利来啦 经过小编的软磨硬泡 终于从高分通过ACP云计算专业认证及大数据专业认证的大牛同事那里要来了考试心得 经验分享 直接看吧 认证考试简介 知己知彼知大纲 首先介绍一下ACP考试 阿里云认证类似于大家
  • flutter Text数字超出全部隐藏 解决方法

    如图 刚开始是这样的 问题原因 前面的 ID 与后面的文字存在间隙 解决方法 修改前 child Text ID 1114954321 textAlign TextAlign right maxLines 1 overflow TextOv
  • 切面打印日志时,参数序列化异常。It is illegal to call this method if the current request is not in asynchron

    1 AOP的日志拦截类中 抛出异常 2 代码如下 package com jimulian iwuxi common aop import com alibaba fastjson JSON import com jimulian iwux
  • 华为OD机试真题-增强的strstr-2023年OD统一考试(B卷)

    题目描述 C 语言有一个库函数 char strstr const char haystack const char needle 实现在字符串 haystack 中查找第一次出现字符串 needle 的位置 如果未找到则返回 null 现
  • Android最简洁的自动换行布局组件

    自动换行是一种布局特性 理所当然应该在布局组件中实现 我们基于ViewGroup实现了最简洁和稳定的自动换行布局组件AutoLinefeedLayout 该组件无需特别设置 只要将孩子塞给它 就会自动换行显示 无任何限制 源码如下 pack
  • [苹果开发者账号]01 使用Apple Developer app注册提示:未能验证证件

    1 登录https developer apple com 2 点击Learn More 3 使用自己的iPhone 到AppStore下载Apple Developer app Apple Developer app使用帮助 https
  • 【高效数据结构——位图bitmap】

    初识位图bitmap 位图 Bitmap 是一种用于表示和操作位 bit 的数据结构 它是由一系列二进制位 0 或 1 组成的序列 每个位都可以单独访问和操作 位图常用于以下情况 压缩存储 位图可以有效地存储大量的布尔值信息 每个位只占用一