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

 

posted @ 2017-08-14 21:44  Diligent_Murcielago  阅读(315)  评论(0编辑  收藏  举报