C语言实现BitMap

BitMap的原理不用多说了。

主要说下位操作。

我们假设每个基础存储单元为char,则BYTESIZE = 8,如果为int则16 or 32。

当设置i时,首先ptr+=i/BYTESIZE,到达要操作的那个char。

然后对*ptr |= 0x01<<(i%BYTESIZE)即可。这里在同一个机器上,可以忽略大小端的问题。

检查的时候,也是首先ptr+=i/BYTESIZE,然后查 (*ptr&0x01<<(i%BYTESIZE)) == 0x01<<(i%BYTESIZE)即可。

上面这个0x01<<…实际上…就是0~7,因此我们可以预定义一个数组pre,防止重复计算。

代码如下:

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

#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<<(i % BYTESIZE));
}

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<<(i%BYTESIZE))==0x01<<(i%BYTESIZE);
}

void bitmap_print(char* buf, int n)
{
	int i;
	int j;
	char bs[BYTESIZE];
	for(i=0;i<BYTESIZE;i++)
	{
		bs[i] = 0x01<<i;
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<BYTESIZE;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;
}

Leave a Reply

Your email address will not be published.