博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bitmap.h和bitmaptest.c(位映射)
阅读量:4321 次
发布时间:2019-06-06

本文共 2871 字,大约阅读时间需要 9 分钟。

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

 

转载于:https://www.cnblogs.com/51CC-YL/p/7360376.html

你可能感兴趣的文章
【z05】聪明的质检员
查看>>
【5001】n皇后问题
查看>>
【codeforces 796D】Police Stations
查看>>
数据库事务与锁详解
查看>>
linux 配置ssh免密码登录
查看>>
《重构》的读后感
查看>>
MySQL索引分析和优化
查看>>
DB2中通用的存储进程分页法度典范
查看>>
Fetchmail 6.3.8
查看>>
俄罗斯邮政将迁移到Linux 有关机构已末尾测试Linux
查看>>
SunOS 4上MySQL详尽事变
查看>>
python升级后pip 不可用 卸载pip
查看>>
推送kafka消息失败
查看>>
Nginx日志增长过快详细分析
查看>>
View Controller Programming Guid for iOS 笔记
查看>>
[模板] 最大流和费用流分别的两种做法
查看>>
python 最大连续子数组的和
查看>>
Python中的闭包
查看>>
05.if else format
查看>>
如何从Eclipse官网下载我们想要的版本
查看>>