原文转自: http://www.oschina.net/code/snippet_1178986_47569#68260
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#define BITMAP_OK 1
#define BITMAP_ERROR 0
typedef struct bitmap_s
{
int bits;
int zero_count;
int one_count;
unsigned char buf[];
}bitmap_t;
static bitmap_t *bitmap;
bitmap_t *bitmap_init(int size);
int bitmap_set(bitmap_t *bitmap, int index, int flag);
void bitmap_free(bitmap_t *bitmap);
int bitmap_get(bitmap_t *bitmap, int index);
bitmap_t *bitmap_init(int size)
{
int nbytes;
if(size % 8 != 0)
nbytes = size / 8 +1;
else
nbytes = size / 8;
bitmap = (bitmap_t *)malloc(sizeof(bitmap_t) + nbytes * sizeof(char));
if(bitmap == NULL)
return NULL;
bitmap->bits = size;
memset(bitmap->buf, 0, nbytes);
bitmap->zero_count = bitmap->bits;
bitmap->one_count = bitmap->bits - bitmap->zero_count;
return bitmap;
}
int bitmap_get(bitmap_t *bitmap, int index)
{
if(index > bitmap->bits)
return BITMAP_ERROR;
int seg = index / 8;
int offset = index % 8;
int tmp = bitmap->buf[seg] & (0x1 <<(8-offset-1));
return tmp > 0 ? 1 : 0;
}
int bitmap_set(bitmap_t *bitmap, int index, int flag)
{
if(index > bitmap->bits)
return BITMAP_ERROR;
int seg = index / 8;
int offset = index % 8;
unsigned char *p = bitmap->buf + seg;
if(flag == 1 && bitmap_get(bitmap, index) ==0)
{
unsigned char tmp = 0x1 << (8-offset -1);
*p |= tmp;
bitmap->zero_count --;
bitmap->one_count ++;
}
if(flag == 0 && bitmap_get(bitmap, index)==1)
{
unsigned char tmp = 0x1 << (8-offset -1) -1;
*p &= tmp;
bitmap->zero_count ++;
bitmap->one_count --;
}
return BITMAP_OK;
}
void bitmap_free(bitmap_t bitmap)
{
free(bitmap);
}
#include <stdio.h>
#include "bitmap.h"
int main()
{
bitmap_t *p = NULL;
if(p = bitmap_init(10))
{
bitmap_set(p, 6, 1);
bitmap_set(p, 2, 1);
bitmap_set(p, 2, 1);
bitmap_set(p, 3, 1);
printf("%d\n", bitmap_get(p, 0));
printf("%d\n", bitmap_get(p, 1));
printf("%d\n", bitmap_get(p, 2));
printf("%d\n", bitmap_get(p, 6));
printf("%d\n", p->buf[0]);
printf("zero_count=%d, one_count = %d\n",bitmap->zero_count, bitmap->one_count);
}
return 0;
}
运行结果:
[root@iTOP-4412]# ./bitmap
0
0
1
1
50
zero_count=7, one_count = 3
00110010 = 50