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)) /
操作函数都比较简单短小,直接贴出来了。

Lighttpd中的bit接合操作剪断精悍,所有的代码都已经在本文中贴出来了。当然,头文件中的函数声明没有贴出来。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述