#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);
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;
}
#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;
}