备注:1.原创文章,转载请标明出处;

2.欢迎建议和意见

3.我的实现是C语言,为了保护公司隐私,下述数据类型被我改了。实际上int应改是无符号4个字节的类型,byte是有符号1个字节,才能保证移植性

4.不贴源码,喜欢的话自己实现~~

在实现一个资源管理模块的时候,需要用到bitmap,但看了下系统的bitmap太复杂,太啰嗦,所以没有参照系统的,自己实现了,内存性能都还不错,

先说思想:把数字根号后变成加法

先说约束:目前由于只供自己模块使用,所以没有做成通用的,当前一个bitmap最大只允许8000个数据,当然很容易扩展成灵活的。

再说成果:1.内存,以8000为例,总共消耗内存(4*8 + 8000/8)/1024 = 1M

2.性能。这两天做了测试,7600多申请或者释放,时间只有2ms,当然这也取决于cpu,我用的是pc机上的VM linux虚拟机,算比较普通

最后说实现:1.源信息是start和end

2.统计信息是count和set_count

3.状态信息是unit_count、last_unit_bytes、byte_count、last_byte_bits

4.位信息在bit_bytes

5.(1)“unit”是逻辑概念,我这里写死为30个byte,可以改为根据源信息个数调整

(2)上述“3.”中提到的各属性出现的原因是,源信息个数不一定是块(下面会有说明)的整数倍,所以要记录最后一个逻辑块有多少、最后一个byte有多少位信息

(3)具体实现查找空闲bit的方式是,1)查看bm是否没有空闲地址了;2)比较块是否全被占位(用),找到可用的块;3)在块中找到可用的byte;4)在byte中找到可用的bit,占位并修改统计信息

(4)如上所述,8000个地址查找最差循环数为8000/(30*8)+30+8=71,也就是说平均为36

概括下:上述中byte表示位的方式使得原本8000的数字变成1000+8,然后“块”(也就是unit)的出现使得1000变成30+34,最终本是30*34*8的8000变成了30+34+8

#define BM_MAX_RANGE_NUM         8000

#define BM_BYTES_BITS 8
#define BM_UNIT_BYTES_NUM 30 /* (BM_UNIT_BITS / BM_BYTES_BITS + 1) */
#define BM_UNIT_BITS (BM_UNIT_BYTES_NUM * BM_BYTES_BITS)
#define BM_FLAGS_FULL_SET_LEN (48)

static struct
{
byte byte_set_flags[8];
byte byte_full_set_flag;
byte unit_full_set_flags[BM_FLAGS_FULL_SET_LEN];
} g_bitmap_vars = { {0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1},
0xff,
{0Xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0Xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0Xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0Xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0Xff, 0Xff, 0Xff, 0Xff, 0Xff, 0Xff, 0Xff, 0Xff,
0Xff, 0Xff, 0Xff, 0Xff, 0Xff, 0Xff, 0Xff, 0Xff }};

typedef struct _bm_s_
{
    int  start;
    int  end;

int  count;
    int  set_count;

int  unit_count;
    int  last_unit_bytes;
    int  byte_count;
    int  last_byte_bits;
    byte    bit_bytes[0];
} BITMAP_T;

自己写bitmap的更多相关文章

  1. Raid1源代码分析--写流程

    正确写流程的总体步骤是,raid1接收上层的写bio,申请一个r1_bio结构,将其中的所有bios[]指向该bio.假设盘阵中有N块盘.然后克隆N份上层的bio结构,并分别将每个bios[]指向克隆 ...

  2. MD中bitmap源代码分析--设置流程

    1. 同步/异步刷磁盘 Bitmap文件写磁盘分同步和异步两种: 1) 同步置位:当盘阵有写请求时,对应的bitmap文件相应bit被置位,bitmap内存页被设置了DIRTY标志.而在下发写请求给磁 ...

  3. 截图原理(一)——Android自动化测试学习历程

    把两节的内容汇总起来,第一节讲的是如何在apk中直接进行截屏,用到了Robotium的Solo类的takeScreenShot方法,有一个小的demo,以及从方法一直往里钻,知道它具体是怎么进行截屏的 ...

  4. 【开源毕设】一款精美的家校互动APP分享——爱吖校推 [你关注的,我们才推](持续开源更新3)附高效动态压缩Bitmap

    一.写在前面 爱吖校推如同它的名字一样,是一款校园类信息推送交流平台,这么多的家校互动类软件,你选择了我,这是我的幸运.从第一次在博客园上写博客到现在,我一次一次地提高博文的质量和代码的可读性,都是为 ...

  5. Replication的犄角旮旯(三)--聊聊@bitmap

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  6. Android图片缓存之Bitmap详解

    前言: 最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap.BitmapFactory这两个类. 图片缓存相关博客地址: Android图片缓 ...

  7. DIB位图(Bitmap)的读取和保存

    设备无关位图(Device Independent Bitmap)是可以保存在磁盘的位图文件,可以从磁盘读取到内存或者从内存保存到磁盘上.它的文件结构是标准化的,可以在Windows/Linux/Un ...

  8. 问题解决——MFC error RC2170: bitmap file res\XXXXXXX.png is not in 3.00 format

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  请通过右侧公告中的“联系邮 ...

  9. android BitMap回收

    第一种方法--及时回收bitmap内存: 一般而言,回收bitmap内存可以用到以下代码 if(bitmap != null && !bitmap.isRecycled()){ bit ...

随机推荐

  1. [P4921] 情侣?给我烧了!

    回顾一下错排公式 错排问题: 设n位错排数为D[n].考虑元素1的位置,设置为k(有n-1中 ):在考虑元素k的位置, 若为1,则转换为n-2位的错排:否则,视元素k为元素1(不能放在位置1),转换为 ...

  2. app自动化测试中的相关api

    这个说的api即python自动化测试中经常会使用到的一些api,具体如下: 1.find_element_by_id/find_elements_by_id 定位元素api,使用方法如下: driv ...

  3. Java NIO中的通道Channel(二)分散/聚集 Scatter/Gather

    什么是Scatter/Gather scatter/gather指的在多个缓冲区上实现一个简单的I/O操作,比如从通道中读取数据到多个缓冲区,或从多个缓冲区中写入数据到通道: scatter(分散): ...

  4. Android并发编程 多线程与锁

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,如果能给各位看官带来一丝启发或者帮助,那真是极好的. 前言 前一篇Android并发编程开篇呢,主要是简单介绍一下线程以及 ...

  5. 浅析JavaScript正则表达式

    1.正则表达式的定义 正则表达式是一个描述字符模式的对象.JavaScript的RegExp类表示正则表达式,String和RegExp都定义了方法,后者使用正则表达式进行强大的模式匹配和文本检索与替 ...

  6. SPI Flash(W25Q16DV) 基本操作

    读取厂家\设备 ID 发送 90H 指令,再发送 00h 的地址,然后接收即可. 代码如下: void SPIFlashReadID(int *pMID, int *pDID) { SPIFlash_ ...

  7. C++多重继承的构造执行顺序

    一个类,它可能有基类,也可能存在多个基类,这些类里面还可能是虚拟基类,并且在类的本身也可能存在对象成员.那么所涉及的这些类或对象成员会以什么样的顺序来调用它们各自的构造函数呢?今天我们就来举例分析下. ...

  8. Sharepoint 2010 工作流状态值

    在Sharepoint2010中,如果要使用工作流状态值进行筛选,必须使用内部值,不能使用文字,要不然是筛选不出来的. 进行中:2 已取消:4 已批准:16 拒绝:17 下边是已取消的工作流状态:

  9. Android目录结构及作用

    1.add-ons-->Google API .比如GoogleMaps 2.build-tools-->各版本SDK编译工具. 3.docs-->离线开发者文档Android SD ...

  10. ASP.NET Identity 一 (转载)

    来源:http://www.cnblogs.com/r01cn/p/5194257.html 注:本文是[ASP.NET Identity系列教程]的第一篇.本系列教程详细.完整.深入地介绍了微软的A ...