lighttp代码真的很优秀,可惜是对我来说还是有点难度,也许太复杂了,很不想放弃,就慢慢学吧,总想一口气吃成胖子心理是不好的,胖子成不了,丧失了兴趣真不值得,从最基本的数据结构看起吧,本人也是个菜鸟,如果理解的不对还请指出哈。
BitSet“位集合”,实现的方法很巧妙,节省了空间,现在我们来看定义:
typedef struct
{
size_t *bits; //保存实际的bit值
size_t nbits; //bit总有效长度
} bitset;
顺便说下 ,size_t一般是无符号的整数,一般不要和负数比较,结果会把负数转成无符号的大整数。
/*一个char字符占用的位数 * sizeof (size_t)即一个size_t类型占用的位数*/
#define BITSET_BITS \
( CHAR_BIT * sizeof(size_t) )
/*pos位的掩码,pos位为1的size_t的值*/
#define BITSET_MASK(pos) \
( ((size_t)1) << ((pos) % BITSET_BITS) )
/*得到pos所在的size_t的值*/
#define BITSET_WORD(set, pos) \
( (set)->bits[(pos) / BITSET_BITS] )
/*用多少个size_t来保存nbits个位 +(BITSET_BITS-1)保证至少有一个size_t来保存*/
#define BITSET_USED(nbits) \
( ((nbits) + (BITSET_BITS - 1)) / BITSET_BITS )
#define SEGFAULT() do { fprintf(stderr, "%s.%d: aborted\n", __FILE__, __LINE__); abort(); } while(0)
/*BitSet初始化*/
bitset *bitset_init(size_t nbits) {
bitset *set;
set = malloc(sizeof(*set));
assert(set);
/*nbits个位占用多少的空间分配*/
set->bits = calloc(BITSET_USED(nbits), sizeof(*set->bits));
set->nbits = nbits;
assert(set->bits);
return set;
}
/*把BitSet内容清零*/
void bitset_reset(bitset *set) {
memset(set->bits, 0, BITSET_USED(set->nbits) * sizeof(*set->bits));
}
/*我添加的函数,将bitset所有值置为1*/
void bitset_allset(bitset *set){
memset(set->bits, 1, BITSET_USED(set->nbits) * sizeof(*set->bits));
}
/*释放BitSet*/
void bitset_free(bitset *set) {
free(set->bits);
free(set);
}
/*将pos位清0*/
void bitset_clear_bit(bitset *set, size_t pos) {
/*pos位置非法*/
if (pos >= set->nbits) {
SEGFAULT();
}
/*将pos位置0*/
BITSET_WORD(set, pos) &= ~BITSET_MASK(pos);
}
/*将pos为置1*/
void bitset_set_bit(bitset *set, size_t pos) {
if (pos >= set->nbits) {
SEGFAULT();
}
BITSET_WORD(set, pos) |= BITSET_MASK(pos);
}
/*测试pos位是1还是0,是1返回1 否则返回0*/
int bitset_test_bit(bitset *set, size_t pos) {
if (pos >= set->nbits) {
SEGFAULT();
}
return (BITSET_WORD(set, pos) & BITSET_MASK(pos)) != 0;
}
阅读(774) | 评论(0) | 转发(0) |