bitmap.h和bitmaptest.c(位映射)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> #define BITMAP_OK 1; #define BITMAP_ERROR 0; typedef struct bitmap_s{ /*有几个bit位*/ int bits; /*为0个数*/ int zero_count; /*为1的个数*/ int one_count; /*字节数组*/ unsigned char buf[]; }bitmap_t; static bitmap_t *bitmap; /*初始化*/ bitmap_t *bitmap_init(int size); /*在字节数组的指定index设置0或1*/ int bitmap_set(bitmap_t *bitmap ,int index,int flag); /*释放字节数组*/ void bitmap_free(bitmap_t *bitmap); /*在指定index获取flag*/ int bitmap_get(bitmap_t *bitmap ,int index); //bitmap 初始化 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; } /*在指定索引index上设置flag*/ 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 temp = (0x1<<(8-offset-1))-1; *p &= temp; bitmap->zero_count ++; bitmap->one_count --; } return BITMAP_OK; } /*获取index位置的flag*/ 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; } /*释放bitmap*/ void bitmap_free(bitmap_t *bitmap){ free(bitmap); }
#include <stdio.h> #include "bitmap.h" //static bitmap_t *bitmap; /** * API 函数 * * bitmap_t *bitmap_init(int size); //初始化 * int bitmap_set(bitmap_t *bitmap ,int index,int flag); //在字节数组的指定index设置0或1 * void bitmap_free(bitmap_t *bitmap); //释放字节数组 * int bitmap_get(bitmap_t *bitmap ,int index); //在指定index获取flag */ 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; }