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. spring Batch实现数据库大数据量读写
  2. windows服务安装
  3. 9月份计算机应用基础统考,2018年9月计算机应用基础统考题库-网考计算机应用基础真题1...
  4. python用什么系统好_10分钟用python搭建一个超好用的CMDB系统
  5. OSPF Packet Details
  6. 呕心沥血 JavaScript知识点梳理大全,超详细 建议收藏!!!
  7. 使用特殊字体实现特殊报表效果
  8. 培训loadrunner感受
  9. java实现qq抢红包_java实现抢红包算法(公平版和手速版)
  10. 黑莓手机刷linux,【教程】黑莓手机 BlackBerry DM6.0 完整刷机教程 含瘦身方法...
  11. editplus显示FTP服务器连接,EditPlus3 FTP 设置对话框
  12. 内外网同时运行路由设置
  13. Devops知识技能树(译)
  14. 数据库学习7 — 嵌套查询
  15. PHP的优势是什么?
  16. Linux手机众筹1000万
  17. [转载]CAE工程师:铁匠还是厨子,这是个问题
  18. ibm aix 抓包命令_在IBM AIX上模拟丢弃的TCP / IP数据包
  19. LaTeX之使用parcolumns宏包实现双栏排版示例
  20. 超级详细的 shell编程知识讲解 —— 第二部分(全文3万多字,看完之后不想成为高手也难!)

热门文章

  1. 利用hutool实现邮件发送功能
  2. 10打开没有反应_【专利】表面施胶剂的反应装置
  3. 用WSL安装Docker镜像
  4. c语言除法在全局区,深入C语言内存区域分配(进程的各个段)详解
  5. oracle 提取连续数字,oracle 得到连续不重复的数字序列
  6. python mssqlserver_python for MSSQLserver
  7. MultipartFile与File之间的相互转换
  8. Layui--弹出层layer
  9. spring配合Junit进行单元测试
  10. 11年亚锦赛球员数据_2020年11月楼市数据更新!全美房屋中间价持续上涨