bitmap类C++实现

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<

bitmap其实就是对位运算的扩展。一般的位运算是int变量,一个int元素记录32个元素(int类型有32位),记录对应位的信息(用二进制的0或者1表示)。不过可以用char使得可能的浪费更小。

  所谓bitmap,就是定义成了数组,可以记录不止32位的信息。比如char bitmap[1000]可以记录多少位信息呢?1000×8。修改与查找的思路很简单,对于修改,首先找到一个大范围,位于数组哪个元素,然后对应元素确定该值对应该元素的哪一位的,通过按位或操作赋值1。除8得到哪个元素,对8求余得到精确位置,我用的是位运算比除法和求余运算要快很多(bitmap本来就是为了加速的和节省空间的)。查找操作也是类似。

你可能感兴趣的:(acm)