bitmap类C++实现

本文介绍了一种位图(bitmap)的数据结构实现方法,并详细解释了如何利用位运算进行高效的信息存储与检索。通过定义BitMap类,文章展示了如何设置和获取特定位置的比特值,适用于内存管理和大规模数据标记等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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本来就是为了加速的和节省空间的)。查找操作也是类似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值