c++怎么实现一个位图(Bitmap)数据结构_c++位运算与空间优化实现

位图用位存储布尔状态,C++中通过位运算高效实现,以字节数组为底层存储,每bit代表一个整数是否存在,支持set、clear、test操作,节省内存至N/8字节。

c++怎么实现一个位图(bitmap)数据结构_c++位运算与空间优化实现

位图(Bitmap)是一种用单个位来存储信息的数据结构,适合处理大量布尔状态的场景,比如去重、排序、布隆过滤器等。C++中通过位运算和空间优化可以高效实现一个轻量级的 Bitmap。

基本原理与设计思路

一个 bit 可以表示 0 或 1 状态,如果我们想记录 N 个整数是否存在,传统数组需要 N 字节,而位图只需 N/8 字节(向下取整并加一),大幅节省内存。

核心思想是:用一个字节数组(或整型数组)作为底层存储,每个 bit 代表一个整数是否出现过。例如第 i 个 bit 为 1 表示整数 i 存在。

关键操作:

立即学习“C++免费学习笔记(深入)”;

set(i):将第 i 位置 1clear(i):将第 i 位置 0test(i):查询第 i 位是否为 1

位运算实现细节

使用位运算对指定位置进行操作。假设我们有一个 unsigned char 数组,要操作第 i 位:

确定该位所在的字节下标:i / 8 或 i >> 3确定在字节内的偏移量:i % 8 或 i & 7设置某一位:使用按位或 |= (1 清除某一位:使用按位与 &= ~(1 测试某一位:使用按位与判断结果是否非零

代码示例:

class Bitmap {private:    std::vector data;    size_t n_bits;

public:explicit Bitmap(size_t bits) : n_bits(bits) {data.resize((bits + 7) / 8, 0); // 向上取整}

void set(size_t i) {    if (i >= n_bits) return;    size_t byte_idx = i >> 3;    size_t offset   = i & 7;    data[byte_idx] |= (1U <= n_bits) return;    size_t byte_idx = i >> 3;    size_t offset   = i & 7;    data[byte_idx] &= ~(1U <= n_bits) return false;    size_t byte_idx = i >> 3;    size_t offset   = i & 7;    return (data[byte_idx] & (1U << offset)) != 0;}

};

空间优化技巧

为了进一步提升性能和减少内存占用,可以考虑以下几点:

使用 uint32_t 或 uint64_t 替代 unsigned char 数组,减少边界检查次数,提高缓存命中率采用模板参数指定元素类型,实现通用性预分配足够空间避免频繁扩容批量操作时可用“平行位”技术或内置函数如 __builtin_popcount 统计 1 的个数

进阶版使用 uint32_t 数组的例子:

templateclass FastBitmap {    static constexpr int BITS_PER_BLOCK = sizeof(Block) * 8;    std::vector data;    size_t n_bits;

public:explicit FastBitmap(size_t bits) : n_bits(bits) {data.resize((bits + BITS_PER_BLOCK - 1) / BITS_PER_BLOCK, 0);}

void set(size_t i) {    if (i >= n_bits) return;    size_t block = i / BITS_PER_BLOCK;    size_t offset = i % BITS_PER_BLOCK;    data[block] |= (Block(1) <= n_bits) return false;    size_t block = i / BITS_PER_BLOCK;    size_t offset = i % BITS_PER_BLOCK;    return (data[block] & (Block(1) <= n_bits) return;    size_t block = i / BITS_PER_BLOCK;    size_t offset = i % BITS_PER_BLOCK;    data[block] &= ~(Block(1) << offset);}

};

应用场景与注意事项

Bitmap 常用于:

快速去重(如统计 1~100 万中出现过的数字)内存敏感的索引结构配合哈希实现布隆过滤器操作系统中的页分配管理

注意点:

只适用于整数范围有限的场景(比如 0~几千万)不支持负数(除非做偏移映射)稀疏数据可能浪费空间,此时可考虑 Roaring Bitmap线程安全需外部保证,必要时加锁或使用原子操作

基本上就这些。掌握位运算和内存布局,就能写出高效简洁的位图实现。

以上就是c++++怎么实现一个位图(Bitmap)数据结构_c++位运算与空间优化实现的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1484579.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C++中的std::filesystem库怎么用_C++文件系统操作与std::filesystem使用指南
上一篇 2025年12月19日 08:11:39
C++怎么使用std::variant进行类型安全的联合_C++类型安全与std::variant应用
下一篇 2025年12月19日 08:11:55

相关推荐

  • mysql中整型是什么 mysql整数类型说明

    %ign%ignore_a_1%re_a_1%中的整数类型包括:1.tinyint,占1字节,范围-128到127或0到255;2.smallint,占2字节,范围-32768到32767或0到65535;3.mediumint,占3字节,范围-8388608到8388607或0到16777215;…

    2026年10月3日
    100
  • VSCode如何配置C++开发环境 VSCode搭建C++项目的完整教程

    VSCode如何配置C++开发环境 VSCode搭建C++项目的完整教程VSCode如何配置C++开发环境 VSCode搭建C++项目的完整教程VSCode如何配置C++开发环境 VSCode搭建C++项目的完整教程VSCode如何配置C++开发环境 VSCode搭建C++项目的完整教程

    首先安装c++++编译器和调试器,windows用户推荐mingw-w64并配置环境变量,macos用户安装xcode command line tools,linux用户通过包管理器安装gcc/g++和gdb;2. 安装vscode并添加c/c++扩展及可选的c/c++ extension pac…

    2026年10月3日 • 用户投稿
    700
  • 为什么硬盘文件无法打开?数据恢复的应急措施是什么?

    为什么硬盘文件无法打开?数据恢复的应急措施是什么?为什么硬盘文件无法打开?数据恢复的应急措施是什么?为什么硬盘文件无法打开?数据恢复的应急措施是什么?为什么硬盘文件无法打开?数据恢复的应急措施是什么?

    硬盘文件无法打开时,应立即停止使用并断电,判断是否为文件系统错误或硬件损坏,优先尝试外部连接、磁盘管理检查及数据恢复软件扫描,避免写入新数据,重要数据建议直接寻求专业帮助。 当你的硬盘文件突然无法打开,这通常预示着一个潜在的问题,它可能只是一个简单的软件小故障,也可能是更严重的硬件损坏。面对这种情况…

    2026年10月3日 • 用户投稿
    800
  • 抖音副总裁回应字节离职赛道:虚假宣传 背后是引流卖课

    抖音副总裁回应字节离职赛道:虚假宣传 背后是引流卖课抖音副总裁回应字节离职赛道:虚假宣传 背后是引流卖课抖音副总裁回应字节离职赛道:虚假宣传 背后是引流卖课抖音副总裁回应字节离职赛道:虚假宣传 背后是引流卖课

    9月16日快讯,据公开报道,抖音集团副总裁李亮针对近期网络上频繁出现的“字节离职”类内容发声回应。 李亮指出,最近在多个社交平台涌现大量以“月薪X万离开字节”为标题的帖子,常配以字节跳动公司LOGO背景或员工工卡照片,引发广泛关注,甚至演变为所谓的“字节离职赛道”话题。 经字节跳动内部核查发现,不少…

    2026年10月3日 • 用户投稿
    100
  • sublime怎么运行c#

    sublime怎么运行c#sublime怎么运行c#sublime怎么运行c#sublime怎么运行c#

    要在 Sublime 中运行 C# 代码,请执行以下步骤:安装 Mono(.NET 实现)。安装 C# 编译器(csc)。为 Sublime 安装 C# 插件(“C# Complete”)。创建并保存一个 .cs 扩展名的 C# 文件。编写 C# 代码。使用 csc 编译器编译代码。使用 mono …

    2026年10月3日 • 用户投稿
    100
  • 抖音播放量怎么查?抖音播放量才几十

    抖音,作为一款备受欢迎的短视频社交平台,为众多内容创作者提供了展示才华的机会。其中,抖音播放量是衡量内容受欢迎程度的关键指标。那么,如何通过抖音播放量来把握内容创作的趋势呢?本文将为您解答。 一、抖音播放量的组成要素 1. 点赞数:点赞数是衡量内容受欢迎程度的关键指标,通常点赞数越高,播放量也会随之…

    2026年10月2日
    000
  • 反转字符串绕杀软

    反转字符串绕杀软反转字符串绕杀软反转字符串绕杀软反转字符串绕杀软

    在github有一个ssi的项目,项目地址如下:https://github.com/dimopouloselias/simpleshellcodeinjector/他可以实现shellcode的远程加载(十六进制),当然ldrakura也曾经搞过类似的项目(我偷电瓶车养你啊),当时还是一次项目时绕…

    2026年10月2日 • 用户投稿
    100
  • 编程新霸!微软重磅推出命令行新工具,数小时冲击GitHub榜首

    编程新霸!微软重磅推出命令行新工具,数小时冲击GitHub榜首编程新霸!微软重磅推出命令行新工具,数小时冲击GitHub榜首编程新霸!微软重磅推出命令行新工具,数小时冲击GitHub榜首编程新霸!微软重磅推出命令行新工具,数小时冲击GitHub榜首

    微软推出令人耳目一新的命令行工具,迅速登顶github趋势榜首! 这不再是你记忆中的传统命令行。 许多用户对Windows系统上黑底白字的命令行界面感到厌倦: 然而,在昨天的微软全球开发者大会 Build 2019上,微软推出的Windows Terminal引起了全场的惊叹——命令行界面竟然可以如…

    2026年10月2日 • 用户投稿
    200
  • 硬盘数据恢复贵吗?如何用低成本恢复丢失的数据?

    硬盘数据恢复贵吗?如何用低成本恢复丢失的数据?硬盘数据恢复贵吗?如何用低成本恢复丢失的数据?硬盘数据恢复贵吗?如何用低成本恢复丢失的数据?硬盘数据恢复贵吗?如何用低成本恢复丢失的数据?

    数据恢复价格因难度而异,首先应停止使用硬盘以防覆盖数据,检查连接后尝试用Recuva、EaseUS等软件恢复;若硬盘有物理损坏需创建镜像或送专业实验室;预防则靠定期备份、RAID、监控SMART状态及安全操作。 硬盘数据恢复的价格差异很大,主要取决于数据丢失的严重程度和恢复的复杂性。自己动手尝试恢复…

    2026年10月2日 • 用户投稿
    100
  • Symfony 5与Mercure实时通信集成:配置、启动与常见访问问题排查

    本文详细介绍了如何在Symfony 5项目中集成Mercure实时通信服务。内容涵盖Mercure Hub的安装、环境变量配置、服务器启动命令,并着重解决了初次配置时常见的Mercure Hub访问问题,强调了URL端口一致性的重要性,确保开发者能顺利构建实时应用。 Mercure实时通信服务概述 …

    2026年10月2日
    200
  • sublime怎么运行代码快捷键

    sublime怎么运行代码快捷键sublime怎么运行代码快捷键sublime怎么运行代码快捷键sublime怎么运行代码快捷键

    Sublime 中运行代码的快捷键为 Ctrl + B(Windows/Linux)或 Cmd + B(macOS)。此快捷键执行下列操作:搜索并执行当前文件中的指定命令(如果有)。尝试在所有文件中搜索命令,并在找到后执行。允许自定义特定语言或文件的运行命令。 Sublime 中运行代码的快捷键 快…

    2026年10月2日 • 用户投稿
    200
  • 英伟达发布Rubin CPX重构算力 谷歌/亚马逊/微美全息等AI芯片群雄加速并起!

    英伟达发布Rubin CPX重构算力  谷歌/亚马逊/微美全息等AI芯片群雄加速并起!英伟达发布Rubin CPX重构算力  谷歌/亚马逊/微美全息等AI芯片群雄加速并起!英伟达发布Rubin CPX重构算力  谷歌/亚马逊/微美全息等AI芯片群雄加速并起!英伟达发布Rubin CPX重构算力  谷歌/亚马逊/微美全息等AI芯片群雄加速并起!

    小K播早报《科创板日报》9月17日讯今日科创板早报主要内容有:工信部发布2025版数字化转型指引;Figure完成10亿美元C轮融资;字节游戏辟谣关闭上海工作室。《科创板日报》主播小K为您播报。 市场动态工信部印发《场景化、图谱化推进重点行业数字化转型的参考指引(2025版)》工业和信息化部办公厅近…

    2026年10月2日 • 用户投稿
    100
  • 香菱圣遗物完全攻略:引爆锅巴之神的终极火力

    香菱圣遗物完全攻略:引爆锅巴之神的终极火力香菱圣遗物完全攻略:引爆锅巴之神的终极火力香菱圣遗物完全攻略:引爆锅巴之神的终极火力香菱圣遗物完全攻略:引爆锅巴之神的终极火力

    想让香菱的旋火轮点燃整个提瓦特吗?圣遗物搭配就是决定火焰威力的核心秘方!这位元气满满的锅巴搭档,输出核心全靠元素爆发驱动。只要装备精准匹配,她的火焰伤害将瞬间爆表。现在就来解锁香菱的最强战斗形态吧! 核心套装选择:是充能续航还是反应爆发? 绝缘之旗印四件套 —— 大招连发的终极引擎! 这是绝大多数香…

    2026年10月2日 • 用户投稿
    200
  • 前荣耀 CEO 赵明谈离职后去向:外面传的都是“捕风捉影”

    前荣耀 CEO 赵明谈离职后去向:外面传的都是“捕风捉影”前荣耀 CEO 赵明谈离职后去向:外面传的都是“捕风捉影”前荣耀 CEO 赵明谈离职后去向:外面传的都是“捕风捉影”前荣耀 CEO 赵明谈离职后去向:外面传的都是“捕风捉影”

    9 月 17 日,前荣耀终端有限公司 ceo 赵明在复旦大学“领变者论坛”上回应了外界关于其离职后去向的种种传闻。 赵明强调,所有流传的“他去哪儿”的消息纯属无稽之谈,他并未与传闻中涉及的公司进行过接洽。“我和一鸣(字节跳动创始人张一鸣)确实认识,但合作一事并不存在。”同时,他也明确表示,与智界之间…

    2026年10月2日 • 用户投稿
    200
  • Java网络编程中的Socket异常处理与数据流选择指南

    Java网络编程中的Socket异常处理与数据流选择指南Java网络编程中的Socket异常处理与数据流选择指南Java网络编程中的Socket异常处理与数据流选择指南Java网络编程中的Socket异常处理与数据流选择指南

    本文深入探讨了Java网络编程中常见的Socket异常,特别是使用ObjectInputStream/OutputStream时可能遇到的连接重置、流损坏等问题。文章分析了ObjectStream在网络通信中的局限性,强调了预设“异常路径”的重要性,并提出了使用BufferedReader/Buff…

    2026年10月1日 • 用户投稿
    200
  • VSCode如何配置物联网开发环境 VSCodeIoT设备编程的特殊设置

    解决vscode配置物联网环境时的编译错误,需检查c_cpp_properties.json或platformio.ini文件中的路径与依赖配置,并确保无语法错误;2. 利用vscode调试iot设备代码,可通过openocd配合launch.json设置断点调试,推荐使用platformio简化流…

    2026年10月1日
    100
  • 解决macOS上CMake无法正确检测Temurin JDK 8 JNI的问题

    解决macOS上CMake无法正确检测Temurin JDK 8 JNI的问题解决macOS上CMake无法正确检测Temurin JDK 8 JNI的问题解决macOS上CMake无法正确检测Temurin JDK 8 JNI的问题解决macOS上CMake无法正确检测Temurin JDK 8 JNI的问题

    本文旨在解决mac++OS环境下,使用Adoptium Temurin JDK 8时,CMake的FindJNI模块无法正确检测JNI路径的问题。即使JAVA_HOME已正确配置,CMake仍可能报错提示缺少JNI相关路径。本教程将详细介绍如何通过在CMake构建命令中显式传递JNI所需的关键变量,…

    2026年10月1日 • 用户投稿
    100
  • C# 任务调度神器 FluentScheduler

    C# 任务调度神器 FluentSchedulerC# 任务调度神器 FluentSchedulerC# 任务调度神器 FluentSchedulerC# 任务调度神器 FluentScheduler

    在编写自动执行的程序时,传统的方法是将其打包成可执行文件(exe),然后使用windows任务计划程序(task scheduler)来设置执行时间和频率。然而,对于秒级别的高频任务,传统方法显得力不从心,通常需要将程序打包成服务并安装在服务器上运行。 最近,我在网上偶然发现了FluentSched…

    2026年10月1日 • 用户投稿
    200
  • java使用教程如何使用正则表达式匹配字符串 java使用教程的正则应用基础教程​

    java使用教程如何使用正则表达式匹配字符串 java使用教程的正则应用基础教程​java使用教程如何使用正则表达式匹配字符串 java使用教程的正则应用基础教程​java使用教程如何使用正则表达式匹配字符串 java使用教程的正则应用基础教程​java使用教程如何使用正则表达式匹配字符串 java使用教程的正则应用基础教程​

    在java中使用正则表达式需先通过pattern.compile()编译正则字符串生成pattern对象,再调用其matcher()方法结合目标字符串创建matcher对象;2. matcher对象通过find()查找子串匹配、matches()判断全串匹配、group()获取匹配内容、start(…

    2026年10月1日 • 用户投稿
    600
  • Sublime任务自动化 Sublime定时执行脚本方法

    Sublime任务自动化 Sublime定时执行脚本方法Sublime任务自动化 Sublime定时执行脚本方法Sublime任务自动化 Sublime定时执行脚本方法Sublime任务自动化 Sublime定时执行脚本方法

    sublime text自身不支持定时任务,但可通过操作系统的调度工具实现脚本的定时执行。具体步骤如下:1. 利用sublime的构建系统、宏和插件实现内部自动化;2. 在windows上使用任务计划程序配置定时任务,设置触发器和启动程序;3. 在macos或linux上使用cron编写定时任务命令…

    2026年10月1日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信