算法学习 - bitmap实现(c++)

BitMap介绍

这里的BitMap指的是把数据存放在一个以bit为单位的数据结构里。
每位都只有0和1两个值。为0的时候,证明值不存在,为1的时候说明存在。

举例来说:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

这是24位,也就是24bit, 同时8bit为1个字节。这里的空间也就是3个字节。

这个时候假如我们要存放2 4 6 8 9 10 17 19 21这些数字到我们的BitMap里,我们只用把对应的位设置为1就可以了。

[0 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0]

这样我们只用3个字节就存放了 9 * sizeof(int)大小的数字。在64位编译器里一般一个int类型是32bit也就是4个字节。我们存放这么多数字,连一个int的空间都不到。

BitMap实现

其实BitMap实现不是很难,只是平时可能用位运算不是特别多。所以不熟悉。

主要的操作有三个,除了初始化之外,就是set() 和 get() 还有 del()方法,这三个,一个是把index置为1,一个是得到index位的0 or 1,最后的是把index位置位0.

下面是代码实现:

//
// Header.h
// BloomFilter
//
// Created by Alps on 15/3/19.
// Copyright (c) 2015年 chen. All rights reserved.
//
//这个是 BitMap.h文件。

class BitMap{
public:
    BitMap(){
        bitmap = NULL;
        size = 0;
    }
    BitMap(int size){ // contractor, init the bitmap
        bitmap = NULL;
        bitmap = new char[size];
        if (bitmap == NULL) {
            printf("ErroR In BitMap Constractor!\n");
        }else{
            memset(bitmap, 0x0, size * sizeof(char));
            this->size = size;
        }
    }


    /* * set the index bit to 1; */
    int bitmapSet(int index){
        int addr = index/8;
        int addroffset = index%8;
        unsigned char temp = 0x1 << addroffset;
        if (addr > (size+1)) {
            return 0;
        }else{
            bitmap[addr] |= temp;
            return 1;
        }
    }

    /* * return if the index in bitmap is 1; */
    int bitmapGet(int index){
        int addr = index/8;
        int addroffset = index%8;
        unsigned char temp = 0x1 << addroffset;
        if (addr > (size + 1)) {
            return 0;
        }else{
            return (bitmap[addr] & temp) > 0 ? 1 : 0;
        }
    }

    /* * del the index from 1 to 0 */
    int bitmapDel(int index){
        if (bitmapGet(index) == 0) {
            return 0;
        }
        int addr = index/8;
        int addroffset = index%8;
        unsigned char temp = 0x1 << addroffset;
        if (addr > (size + 1)) {
            return 0;
        }else{
            bitmap[addr] ^= temp;
            return 1;
        }
    }

private:
    char *bitmap;
    int size;
};

调用方法,大家应该都会。
代码比较简单,我下面的博客会写Bloom Filter, 用到了这个BitMap。

你可能感兴趣的:(数据结构,C++,bitmap)