代码中需求大量的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)中的位置。