1 /**
 2  *文件:bit.h
 3  *目的: 实现bitmap数据结构
 4  *作者:杜小波
 5  *联系方式:code2living@gmail.com
 6  **/
 7
 8 #ifndef _BIT_H_
 9 #define _BIT_H_
10
11 /**
12  *存储bitmap的结构体
13  *存储的顺序从左至右
14  **/
15 struct _Bits;
16 typedef struct _Bits *bits;
17
18 /**
19  *获得bitmap
20  *@length bitmap的长度
21  *@return 所有位都初始化为0的bitmap
22  */
23 bits bit_new(unsigned int length);
24
25 /**
26  *销毁一个bitmap
27  **/
28 void bit_destroy(bits bit);
29
30 /**
31  *获得y一个bitmap的长度
32  *@bit 需要获得长度的bitmap
33  *@return bit的长度
34  **/
35 unsigned int bit_length(bits bit);
36
37 /**
38  *设置bitmap中相应位置的值
39  *@bit 待设置的bitmap
40  *@pos  需要设置的位置
41  **/
42 void bit_set(bits bit, unsigned int pos, unsigned char value);
43
44 /**
45  *设置bitmap中相应位置的值
46  *@bit  待获取的bitmap
47  *@pos  获取的位置
48  **/
49 char bit_get(bits bit, unsigned int pos);
50
51 #endif /*_BITS_H_*/

#include "bit.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>struct _Bits {char *bits;unsigned int length;
};bits bit_new(unsigned int length)
{bits new_bits = (bits)malloc(sizeof(struct _Bits));if (new_bits == NULL)return NULL;int char_nums = sizeof(char) * (length >> 3) + 1;new_bits->bits = (char *)malloc(char_nums);if (new_bits == NULL) {free(new_bits);return NULL;}memset(new_bits->bits, 0, char_nums);new_bits->length = length;return new_bits;
}void bit_destroy(bits bit)
{free(bit->bits);free(bit);
}unsigned int bit_length(bits bit)
{return bit->length;
}void bit_set(bits bit, unsigned int pos, unsigned char value)
{unsigned char mask = 0x80 >> (pos & 0x7);if (value) {bit->bits[pos>>3] |= mask;} else {bit->bits[pos>>3] &= ~mask;}
}char bit_get(bits bit, unsigned int pos)
{unsigned char mask = 0x80 >> (pos & 0x7);return (mask & bit->bits[pos>>3]) == mask ? 1 : 0;
}

 1 #include <stdio.h>
 2 #include "bit.h"
 3 #define LEN 15
 4 int main(void)
 5 {
 6     bits bit = bit_new(LEN);
 7
 8     printf("length: %u\n", bit_length(bit));
 9
10     unsigned int test_value = 0x735D;
11     unsigned char value;
12     int i;
13     for (i = LEN - 1; i >= 0; i--) {
14         value = test_value & 1;
15         bit_set(bit, i, value);
16         test_value >>= 1;
17     }
18
19     for (i = 0; i < LEN; i++) {
20         printf("%d", bit_get(bit, i));
21     }
22     printf("\n");
23
24     bit_destroy(bit);
25
26     return 0;
27 }

欢迎大家对小弟的作品进行挑错

转载于:https://www.cnblogs.com/chunxia/archive/2013/04/28/3049243.html

c语言实现bitmap的基本操作相关推荐

  1. C语言中文件的基本操作函数fprintf和fscanf实例介绍

    C语言文章更新目录 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C语言基础-第一个C程序 C语言基础-简单程序分 ...

  2. 大连东软c语言编程题,大连东软信息学院C语言实验一 windows基本操作和turboc使用答案.doc...

    大连东软信息学院C语言实验一 windows基本操作和turboc使用答案 实验一 Windows基本操作及Turbo C2.0编译环境 一.实验目的 1.熟悉Windows操作系统的基本操作,如文件 ...

  3. C语言循环队列的基本操作(init,enquene,dequene)与杨辉三角(C和C++<queue>)

    C语言循环队列的基本操作与杨辉三角(C和C++的表示方法) C语言的表示方法 #include <stdio.h> #include <malloc.h> #define ma ...

  4. c语言如何标志置1与置0,c语言对于文本的基本操作

    字符读写函数  :fgetc和fputc 字符串读写函数:fgets和fputs 数据块读写函数:freed和fwrite 格式化读写函数:fscanf和fprinf 1.字符读写: fgetc函数的 ...

  5. C语言实现单链表基本操作

    C语言实现单链表基本操作的 目录

  6. C语言实现环形队列基本操作

    C语言实现环形队列基本操作(以简单排队问题为例) 通过调用简单函数实现顺序表的相关操作.代码编译环境为VS2019 16.9.4.因为VS的某些原因,scanf写为了scanf_s,作用是一样的,在其 ...

  7. 二叉树的基本运算实验报告C语言,实验三 二叉树基本操作与应用实验

    实验三 二叉树基本操作与应用实验 第三次实验主要包括两部分内容:1.二叉树基本操作实验:2.二叉树应用-赫夫曼树与赫夫曼编码实验.基本操作包括存储结构建立和遍历算法,本文只给出部分参考程序,请大家尽量 ...

  8. 【算法与数据结构专场】BitMap算法基本操作代码实现

    上篇我们讲了BitMap是如何对数据进行存储的,没看过的可以看一下[算法与数据结构专场]BitMap算法介绍 这篇我们来讲一下BitMap这个数据结构的代码实现. 回顾下数据的存储原理 一个二进制位对 ...

  9. c语言 字符串map,C语言实现BitMap

    BitMap的原理不用多说了. 主要说下位操作. 我们假设每个基础存储单元为char,则BYTESIZE = 8,如果为int则16 or 32. 当设置i时,首先ptr+=i/BYTESIZE,到达 ...

最新文章

  1. 我来说说14届竞赛内容,别拍勿喷
  2. 支付宝支付-提现到个人支付宝
  3. python requests请求失败重试_Python Requests.post()请求失败时的retry设置
  4. GRE tunnel源码分析之发送流程
  5. 计算机组成原理中英对照篇,信息科学系课程介绍(中英对照).doc
  6. python画鱼_Python经典五人分鱼实例讲解
  7. linux-安装-MySQL
  8. 浅谈jquery中prop()和attr()
  9. easyui图标对照 --由于文章历史久远, 博主放弃治疗了
  10. Sentinel控制台搭建使用
  11. vue run dev报错 缺少package.json文件
  12. php doctrine,PHP和Doctrine:如何创建唯一ID
  13. 骑士cms任意代码执行(CVE-2020-35339)
  14. 加薪申请书怎么写?加薪申请范文,想涨工资的看过来!
  15. 无头浏览器和抓取-解决方案
  16. (附源码)springboot美食分享系统 毕业设计 612231
  17. 网络视频聊天室的开发指南
  18. k8s证书过期怎么办?
  19. 苏嵌学习日志06 07.14
  20. 对网络日志分析的几个方面

热门文章

  1. 使用若依写微信小程序登录授权认证接口
  2. 最新中烟新商盟JS逆向分析实战教程
  3. 使用hexo+GitHub搭建步骤
  4. java 内部类 单例_确保对象的唯一性——单例模式 (四):一种更好的单例实现方法(静态内部类)...
  5. [Ext JS4] 数据包
  6. 使用 JS刷新框架子页面
  7. 如何清除web 服务器的缓存
  8. 模拟角频率和数字角频率的关系
  9. java 图形 登录_Java图形界面——登录框
  10. python 函数参数self_Python类中self参数用法详解