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


    使用一个比特位来表示一个事件的两种状态,即节省内存,又可以提高运行速度。在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的主要操作都有四个宏来实现:
    各个宏的作用都在注释中说明。

     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)) /

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

    Code

     Lighttpd中的bit接合操作剪断精悍,所有的代码都已经在本文中贴出来了。当然,头文件中的函数声明没有贴出来。。。

  • 相关阅读:
    AjaxPro版自动完成(Autocomplete)功能实现
    推荐一款小巧的截图工具
    在VS2008中设置jquery智能提示
    Jquery选择器全总结
    MD5消息摘要算法的那些事
    C#中的集合学习笔记
    委托,文件流,扩展方法学习笔记
    Jquery实现仿腾讯微薄的广播发表
    C#中的文件流学习笔记第一篇
    ASP.NET MVC小记第一篇
  • 原文地址:https://www.cnblogs.com/kernel_hcy/p/1596223.html
Copyright © 2020-2023  润新知