位图

作者: 欧阳_z | 来源:发表于2020-08-31 18:43 被阅读0次

1、简介
位图的基本概念是用一个比特位来标记某个数据的存放状态,由于采用了位为单位来存放数据,所以节省了大量的空间。

应用方面可以在海量数据中去除重复数据,给不重复数据排序,判断某个数据书否在某一堆数据中,数据压缩等。

缺点是不适合多状态 一个bit只能表示两种状态,如果要表示更多的状态,就需要更多的状态位来实现。
如果一个数字需要多个状态位来表示的话,位图的优越性也会大打折扣,而且复杂度却在增加。

2、下面写一个C语言的判断给定数字是否在原始数据中的代码:

#include <stdio.h>
#include <string.h>

void init(int *bit, int *data, int bit_length, int data_length)
{
    int i;
    int n, m;
    memset(bit, 0, bit_length * sizeof(bit[0]));
    for (i = 0; i < data_length; i++)
    {
        n = data[i] / (sizeof(bit[0])*8);
        if (n > bit_length)
            continue;
        m = data[i] % (sizeof(bit[0])*8);
        bit[n] |= (1 << m); // 把第m位 置1
    }
}

int existence(int bit[], int length, int x)
{
    int n = x / (sizeof(bit[0])*8);
    if (n > length)
        return 0;
    int m = x % (sizeof(bit[0])*8);
    int r = bit[n] & (1 << m); // 取出 第m位
    return (0 == r ? 0 : 1);
}

int main()
{
    int data[] = {3, 2, 6, 5, 8, 4, 60, 30}; // 原始数据
    int bit[2];

    // 初始化位图
    init(bit, data, sizeof(bit) / sizeof(bit[0]), sizeof(data) / sizeof(data[0]));
    
    // 判断某数字是否存在数组 data 中
    printf("%d\n", existence(bit, sizeof(data) / sizeof(data[0]), 9));
    printf("%d\n", existence(bit, sizeof(data) / sizeof(data[0]), 60));
    printf("%d\n", existence(bit, sizeof(data) / sizeof(data[0]), 160));

    return 0;
}

3、位图在 C++ 中有实现bitset类。
上面的C代码换成C++ 代码如下:

#include <iostream>
#include <bitset>
using namespace std;

void init(bitset<64> &bit, int *data, int data_length)
{
    int i;
    
    for (i = 0; i < data_length; i++)
    {
        if (data[i] >= bit.size())
            continue;
        bit.set(data[i], 1); // 将第n位置1
    }
}

int existence(bitset<64> &bit, int x)
{
    if (x >= bit.size())
        return 0;
    if (bit.test(x)) // 或者 if (bit[x] == 1)
        return 1;
    return 0;
}

int main()
{
    int data[] = {3, 2, 6, 5, 8, 4, 60, 30}; // 原始数据
    bitset<64> bit;

    // 初始化位图
    init(bit, data, sizeof(data) / sizeof(data[0]));
    
    // 判断某数字是否存在数组 data 中
    cout << existence(bit, 9) << endl;
    cout << existence(bit, 60) << endl;
    cout << existence(bit, 160) << endl;

    return 0;
}

相关文章

  • 两个位图覆盖合成为一个位图

    /** *把两个位图覆盖合成为一个位图,以底层位图的长宽为基准 *@parambackBitmap在底部的位图 *...

  • BMP位图格式解析

    一般BMP图像文件由以下4部分组成:位图文件头、位图信息头、调色板、实际的位图数据。位图文件头数据结构: 位图信息...

  • 干货 | 非常完整的人体穴位图与功效(果断收藏)

    人体穴位作用图解大全更清晰直观的标注了各个人体穴位,包括头部穴位图、胸部穴位图、背部穴位图、胳膊手部穴位图、人体腿...

  • CorelDRAW位图转换矢量图

    使用CorelDRAW 软件中的快速描摹位图就是可以使位图转化为矢量图的一个过程,不过描摹位图之后,会丢掉很多位图...

  • 位图和布隆过滤器

    位图 位图的概念 位图(bitmap)其实就是哈希表的一种特殊情况。不同的是位图是通过二进制位来表示数据是否存在。...

  • ESP8266学习:U8G2驱动OLED

    drawXBM x:X位置。y:Y位置。w:位图的宽度。h:位图的高度。bitmap:指向位图开始的指针 draw...

  • 关于一些东西

    简述矢量图和位图的区别。 答:根据存储方式的不同,电脑图形或图像可分为两大类,即位图和矢量图。 位图:位图比较适合...

  • iOS Skeleton Screen加载占位图

    iOS Skeleton Screen加载占位图 iOS Skeleton Screen加载占位图

  • Redis第1️⃣3️⃣课 BitMap 位图

    字母big的位图,对应上图 设置位图会触发补零操作 所以最好不要在一个很小的位图上往后很多位上设置位图。这不得不补...

  • 位图

    画图片水印开启一个位图上下文,和view无关,所以不需要在drawRect方法中。位图上下文需要我们手动创建,最后...

网友评论

      本文标题:位图

      本文链接:https://www.haomeiwen.com/subject/pvrpsktx.html