返回介绍

Bitmap

发布于 2025-02-22 13:01:21 字数 1410 浏览 0 评论 0 收藏 0

最开始接触 bitmap 是在《编程珠玑》这本书上,书中所述的方法有点简单粗暴,不过思想倒是挺好——从信息论的角度来解释就是信息压缩了。即将原来 32 位表示一个 int 变为一位表示一个 int. 从空间的角度来说就是巨大的节省了(1/32)。可能的应用有 大数据排序/查找(非负整数)

C++ 中有 bitset 容器,其他语言可用类似方法实现。

Implementation

C

#include <stdio.h>
#include <stdlib.h>

/*
 * @param bits: uint array, i: num i of original array
 */
void setbit(unsigned int *bits, unsigned int i, int BIT_LEN)
{
    bits[i / BIT_LEN] |= 1 << (i % BIT_LEN);
}

/*
 * @param bits: uint array, i: num i of original array
 */
int testbit(unsigned int *bits, unsigned int i, int BIT_LEN)
{
    return bits[i / BIT_LEN] & (1 << (i % BIT_LEN));
}

int main(int argc, char *argv[])
{
    const int BIT_LEN = sizeof(int) * 8;
    const unsigned int N = 1 << (BIT_LEN - 1);
    unsigned int *bits = (unsigned int *)calloc(N, sizeof(int));
    for (unsigned int i = 0; i < N; i++) {
        if (i % 10000001 == 0) setbit(bits, i, BIT_LEN);
    }

    for (unsigned int i = 0; i < N; i++) {
        if (testbit(bits, i, BIT_LEN) != 0) printf("i = %u exists.\n", i);
    }
    free(bits);
    bits = NULL;

    return 0;
}

源码分析

核心为两个函数方法的使用, setbit 用于将非负整数 i 置于指定的位。可用分区分位的方式来理解位图排序的思想,即将非负整数 i 放到它应该在的位置。比如 16,其可以位于第一个 int 型的第 17 位,具体实现即将第 17 位置一,细节见上面代码。测试某个数是否存在于位图中也可以采用类似方法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文