BitMap的原理不用多说了。
主要说下位操作。
我们假设每个基础存储单元为char,则BYTESIZE = 8,如果为int则16 or 32。
当设置i时,首先ptr+=i/BYTESIZE,到达要操作的那个char。
然后对*ptr |= 0x01<
检查的时候,也是首先ptr+=i/BYTESIZE,然后查 (*ptr&0x01<
上面这个0x01<
代码如下:
#include
#include
#include
#define BYTES 1024
#define BYTESIZE 8
char buffer[BYTES];
char pre[8] = {0x01<<0, 0x01<<1, 0x01<<2, 0x01<<3, 0x01<<4, 0x01<<5, 0x01<<6, 0x01<<7};
void bitmap_init(char* buf, int n)
{
memset(buf, 0, sizeof(char)*n);
}
void bitmap_set(char* buf, int n, int i)
{
int add = i/BYTESIZE;
int pos = i%BYTESIZE;
if(add>=n)
{
return ;
}
buf += add;
*buf |= pre[pos]; //*buf |= (0x01<
}
int bitmap_check(char* buf, int n, int i)
{
int add = i/BYTESIZE;
int pos = i%BYTESIZE;
if(add>=n)
{
return 0;
}
buf += add;
return (*buf&pre[pos])==pre[pos]; // return (*ptr&0x01<
}
void bitmap_print(char* buf, int n)
{
int i;
int j;
char bs[BYTESIZE];
for(i=0;i
{
bs[i] = 0x01<
}
for(i=0;i
{
for(j=0;j
{
if((*buf&bs[j])==bs[j])
{
printf("%d\n", i*BYTESIZE+j);
}
}
buf++;
}
}
int main()
{
bitmap_init(buffer, BYTES);
bitmap_set(buffer, BYTES, 999);
printf("%d\n", bitmap_check(buffer, BYTES, 999));
printf("%d\n", bitmap_check(buffer, BYTES, 998));
bitmap_print(buffer, BYTES);
return 0;
}