位图bitmap的实现作用

#include <stdio.h>
#include <string.h>


//位图类
class CBitMap
{
public:
  CBitMap(size_t count)
  {
    if (count <=0)
    {
        count = 1;
    }
    m_count = count;
    m_bitmap = new unsigned char[m_count + 1];
    memset(m_bitmap,0,m_count + 1);

  }

  ~CBitMap()

  {
    if (NULL != m_bitmap)
    {
        delete [] m_bitmap;
m_bitmap = NULL;
    }
  }
  
  int GetBit(size_t pos)
  {
     if (pos > m_count)
     {
         return 0; 
     }
     unsigned char Mask = 0x80; //bit 1000 0000
     size_t bitpos = pos % 8; //在一个char的第几位
     for (int i = 0;i < bitpos;++i)
     {
        Mask = Mask >> 1;
     }
     return (((m_bitmap[(int)(pos / 8)] & Mask) == Mask ) ? 1 : 0);
  }
  
  void SetBit(size_t pos,bool state)
  {
      if (pos > m_count)
      {
         return;
      } 
      unsigned char Mask = 0x80;
      size_t bitpos = pos % 8; //在一个char的第几位
      for (int i = 0;i < bitpos;++i)
      {
        Mask = Mask >> 1;
      }
      if (state)
      {
           m_bitmap[(int)(pos/8)] = m_bitmap[(int)(pos/8)] | Mask;
      }
      else
      {
           m_bitmap[(int)(pos/8)] = m_bitmap[(int)(pos/8)] & (~Mask);
      }
  } 


  size_t GetBitCount()
  {   
      size_t count = 0;
      for (int i = 0; i < m_count; ++i)
      {
         if (GetBit(i))
{
            ++count;  
}
      }
      return count;  
  } 
private:
  unsigned char* m_bitmap;
  //size_t m_bitcount; //1的个数
  size_t m_count; //总个数  
};




int main(int args,char** argv)
{
  /*
   *  位图排序 :
   *  只要针对对大量(如3G数据无法全部载入内存,并且无重复数据,知道数据最大值得大概范围 3G用位图只用 3G/8*1024*1024的MB内存)
   *  假设 ary数据很大无法加载到内存
   *  使用位图排序对ary进行排序
   *
   *  位图更多应用
   *  位图是一种数据压缩技术,常用的像哈夫曼编码,文档数据压缩都会用到
   *  P2P在下载文件会对文件分片,比如500BM大小的文件,分成1k每片 那总的片数 500*1024 
   *  如果用int来表示每片的状态那需要字节数为 size_t total = 500*1024*sizeof(int)
   *  这对于网络交换或者服务器存储来说就巨大的。如果用位图存储 size_t total = 500*1024/1024*8 的字节数
   *  这样只需要60K的空间就可以了 
  */
  int ary[10] = {9,2,1,4,13,6,7,15,33,11};
  size_t MaxCount = 50;
  CBitMap bitmap(MaxCount);
  for (int i=0;i<10;++i)
  {
     bitmap.SetBit(ary[i],true);
  }
  
  for (int i=1;i<MaxCount;++i)
  {
     if (bitmap.GetBit(i))
     {
         printf("%d ",i);
     } 
  }
  
  printf("\n");
  return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值