有意思的需求大量标志位的写法

来源:互联网 发布:图片标识软件 编辑:程序博客网 时间:2024/06/07 10:00

代码中需求大量的on/off标志位。

自己的想法:建立一个byte 数组存放标志。但是这种写法在添加或删除一个标志的时候很麻烦。

别人的一种写法。

把所有的标志放到enum里

enum

{

    symbol_1;

symbol_2;

symbol_3;

symbol_4;

......

symble_totle;//用于标示需要的标志位的数目

}

 

#define int_size sizeof(int)

 

int mask[(symbol_totle+int_size-1)/int_size];

 

#define Filter_init  (memset(mask,0,sizeof(mask)))

#define Filter_set(b)  (mask[b/int_size] |=( (int)i)<<(b%int_size))

#define Filter_is_set(b)  (mask[b/int_size] & ( (int)i)<<(b%int_size))

#define Filter_clear(b)  (mask[b/int_size] &=(~( (int)i)<<(b%int_size)))

 

 

使用的时候就可以直接用了。

想了好久才明白。

实际可以算是一种hash。

可以动态计算出需要的mask数组的大小。把 symbol/int_size 相同的标志位hash到同一个mask中的一个元素中(一个int中)

,然后使用%运算,计算该symbol在组成int的32位(int_size)中的位置。