文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>lighttpd-1.4.22源码分析之一BitSet实现

lighttpd-1.4.22源码分析之一BitSet实现

时间:2009-08-11  来源:mseaspring

    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;
}


相关阅读 更多 +
排行榜 更多 +
Event Horizon

Event Horizon

飞行射击 下载
Counter Terrorist Sniper Shoot

Counter Terrorist Sniper Shoot

飞行射击 下载
Special Agent

Special Agent

飞行射击 下载