BITS_TO_LONGS
定义在:include/Linux/bitops.h
#define BITS_PER_BYTE 8
#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
DIV_ROUND_UP
定义在:include/linux/kernel.h (line 58)
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
其目的就是求一个数是几个long的长度。
例:sizeof(long) = 4;
则
BITS_TO_LONGS(31) = 1
BITS_TO_LONGS(32) = 1
BITS_TO_LONGS(33) = 2
sizeof(long) = 4,所以BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, 32)
BITS_TO_LONGS(nr)就是((nr) + (32 -1) / (32))就是判断nr这个数是属于几个long类型
nr = 1~32:1
nr = 32~64:2
nr = 65~96:3
nr = 97~128:4
nr = 129~160:5
//...
//...
结合定义unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];
就是根据KEY_CNT的个数定义一个数组,如果KEY_CNT小于32,就定义成keybit[1],如果大于32就装不下了就要使用keybit[2]这么大的数组了。
这么做一方面是为了提高兼容性,万一数量改变,还要记得修改定义的数组大小,定义成宏,定义数组的时候会根据数量自动判断应该创建多大的数组