这里的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实现不是很难,只是平时可能用位运算不是特别多。所以不熟悉。
主要的操作有三个,除了初始化之外,就是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。
原文:http://blog.csdn.net/alps1992/article/details/44599387