0

0

C++如何实现一个简单的位图(Bitmap)_C++数据结构与位图实现

下次还敢

下次还敢

发布时间:2025-11-16 08:26:02

|

990人浏览过

|

来源于php中文网

原创

位图通过位操作高效管理布尔状态,使用std::vector按位存储,支持set、reset、get操作,适用于去重、排序等场景,空间时间效率优于集合容器。

c++如何实现一个简单的位图(bitmap)_c++数据结构与位图实现

位图(Bitmap)是一种高效的数据结构,用来表示一组布尔值(0 或 1),常用于快速标记和查询某个元素是否存在。在 C++ 中,可以通过 std::vector 或手动使用整型数组配合位操作来实现一个简单的位图。下面介绍一种基于位操作的自定义位图实现。

基本原理

位图的核心思想是:用一个 bit 来表示一个整数的状态(比如是否存在)。假设我们要管理 0 到 N-1 的整数,那么只需要 (N + 31) / 32 个 32 位整数(即 unsigned int)即可存储所有状态。

每个 bit 对应一个整数:

  • bit[i] = 1 表示整数 i 存在
  • bit[i] = 0 表示整数 i 不存在

通过位运算可以高效地进行设置、清除和查询操作。

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

LongShot
LongShot

LongShot 是一款 AI 写作助手,可帮助您生成针对搜索引擎优化的内容博客。

下载

关键位操作

要实现位图,需要掌握三个基本操作:

  • 确定所在整数位置:index / 32 → index >> 5
  • 确定在该整数中的 bit 位置:index % 32 → index & 0x1F
  • 设置某一位为 1:bits[i >> 5] |= (1U
  • 设置某一位为 0:bits[i >> 5] &= ~(1U
  • 查询某一位是否为 1:(bits[i >> 5] & (1U

简单 Bitmap 类实现

#include 
#include 

class Bitmap {
private:
    std::vector bits;
    size_t size;

public:
    // 构造函数:指定最大处理的数值范围 [0, n)
    Bitmap(size_t n) : size(n) {
        bits.resize((n + 31) / 32, 0);
    }

    // 设置第 i 个位为 1
    void set(size_t i) {
        if (i >= size) return;
        bits[i >> 5] |= (1U << (i & 0x1F));
    }

    // 将第 i 个位清零
    void reset(size_t i) {
        if (i >= size) return;
        bits[i >> 5] &= ~(1U << (i & 0x1F));
    }

    // 查询第 i 个位是否为 1
    bool get(size_t i) const {
        if (i >= size) return false;
        return (bits[i >> 5] & (1U << (i & 0x1F))) != 0;
    }

    // 打印前 n 个位的状态(用于调试)
    void print(size_t n) {
        for (size_t i = 0; i < n && i < size; ++i) {
            std::cout << get(i);
        }
        std::cout << std::endl;
    }
};

使用示例

int main() {
    Bitmap bm(64); // 支持 0~63

    bm.set(10);
    bm.set(20);
    bm.set(31);

    std::cout << "位状态: ";
    bm.print(32); // 输出前32位

    std::cout << "get(10): " << bm.get(10) << std::endl; // 1
    std::cout << "get(15): " << bm.get(15) << std::endl; // 0

    bm.reset(10);
    std::cout << "reset 后 get(10): " << bm.get(10) << std::endl; // 0

    return 0;
}

这个简单的位图适用于去重、排序(如计数排序变种)、布隆过滤器底层等场景。相比直接使用 std::setstd::unordered_set,位图在处理密集整数时空间和时间效率更高。

基本上就这些。理解位操作是关键,实际应用中还可以扩展支持更多功能,比如按位与/或、统计 1 的个数(popcount)等。不复杂但容易忽略边界检查和位运算细节。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

522

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

190

2025.08.29

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

529

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

11

2025.12.22

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

43

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

35

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号