bitmap C语言实现



原文转自: 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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值