class BitMap
{
private:
char *bitmap;
int gsize;
public:
BitMap(){
//默认10000
gsize = (10000>>3) + 1;
bitmap = new char[gsize];
memset(bitmap,0,sizeof(bitmap));
}
BitMap(int n){
gsize = (n>>3) + 1;
bitmap = new char[gsize];
memset(bitmap,0,sizeof(bitmap));
}
~BitMap()
{
delete [] bitmap;
}
int get(int x)
{
int cur = x>>3;
int remainder = x&(7);
if(cur > gsize)return -1;//越界了不行
return (bitmap[cur]>>remainder)&1;
}
bool set(int x)
{
int cur = x>>3;//获取元素位置
int remainder = x&(7);//获取精确位置
if(cur > gsize)return 0;
bitmap[cur] |= 1<<remainder;//赋值
return true;
}
};
bitmap其实就是对位运算的扩展。一般的位运算是int变量,一个int元素记录32个元素(int类型有32位),记录对应位的信息(用二进制的0或者1表示)。不过可以用char使得可能的浪费更小。
所谓bitmap,就是定义成了数组,可以记录不止32位的信息。比如char bitmap[1000]可以记录多少位信息呢?1000×8。修改与查找的思路很简单,对于修改,首先找到一个大范围,位于数组哪个元素,然后对应元素确定该值对应该元素的哪一位的,通过按位或操作赋值1。除8得到哪个元素,对8求余得到精确位置,我用的是位运算比除法和求余运算要快很多(bitmap本来就是为了加速的和节省空间的)。查找操作也是类似。