注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

FY

Johnson 's Blog

 
 
 

日志

 
 

Lighttpd1.4.20源码分析之bitset.c(h) -------位集合的使用  

2014-06-23 18:06:17|  分类: LINUX |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://www.cnblogs.com/kernel_hcy/archive/2009/11/04/1596223.html



使用一个比特位来表示一个事件的两种状态,即节省内存,又可以提高运行速度。在Lighttpd中,提供了一个bitset数据结构,用来管理使用一个比特位集合。
在bitset.h中,比特位集合的数据结构定义如下:
typedef struct 
{
size_t *bits;
size_t nbits;
} bitset;
bits指向一个size_t类型的数组,存放bit集合。size_t类型通常被定义成一个无符号的整型(int或long),其长度和具体的机器有关,这个读者可以查阅相关的资料。nbits记录bitset中bit为的个数。其图示如下:
+-------------+
| bitset结构     |
+-------------+       +-----------------------------+
|   bits           |   -------->          |  |  |  |  |  |  |  |  |  |  | | | | | |
+-------------+       +-----------------------------+
|  nbits = 10   |
+-------------+

为了提高运行的速度,对与bitset的主要操作都有四个宏来实现:
各个宏的作用都在注释中说明。
复制代码
Lighttpd1.4.20源码分析之bitset.c(h) -------位集合的使用 - FY - FY
 1 //计算一个size_t类型有占多少位。
 2 //CHAR_BIT表示一个char类型占多少为,在/usr/include/limits.h中定义,本人机器中定义为8.
 3 #define BITSET_BITS \
 4     ( CHAR_BIT * sizeof(size_t) )
 5 
 6 /**
 7  * 得到一个pos位置为1,其他位置都为0的size_t类型的掩码。
 8  * 其中pos位置是这个位在bitset中的位置,因此要模一个BITSET_BITS才是其在size_t中的位置。
 9  */
10 #define BITSET_MASK(pos) \
11     ( ((size_t)1<< ((pos) % BITSET_BITS) )
12 /**
13  * 计算pos位在set中的bits数组中的位置。
14  * 也就是,pos位在数组bits中,包含在那个size_t类型的成员中。
15  */
16 #define BITSET_WORD(set, pos) \
17     ( (set)->bits[(pos) / BITSET_BITS] )
18 
19 /**
20  * 由于bitset中是用size_t类型数组来存放bit位的,因此实际开的空间应该是size_t的整数倍。
21  * 这个宏就是用来计算在需要nbits个位的情况下,要开多少内存空间。
22  * 也就是计算nbits是BITSET_BITS的整数倍加一。
23  */
24 #define BITSET_USED(nbits) \
25     ( ((nbits) + (BITSET_BITS - 1)) /
复制代码

 

操作函数都比较简单短小,直接贴出来了。

Lighttpd1.4.20源码分析之bitset.c(h) -------位集合的使用 - FY - FYCode

 Lighttpd中的bit接合操作剪断精悍,所有的代码都已经在本文中贴出来了。当然,头文件中的函数声明没有贴出来。。。
  评论这张
 
阅读(79)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018