Chinaunix首页 | 论坛 | 博客
  • 博客访问: 575728
  • 博文数量: 226
  • 博客积分: 10080
  • 博客等级: 上将
  • 技术积分: 1725
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-26 11:15
文章分类

全部博文(226)

文章存档

2011年(5)

2010年(64)

2009年(99)

2008年(37)

2007年(21)

我的朋友

分类: LINUX

2009-08-11 23:18:15

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


阅读(734) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~