我是一名相对优秀的 C 程序员,我喜欢做研究而不喜欢提问,但这段特别的代码简直令人不安。 它与XQueryKeymap一起使用,但我根本不理解它:
#define BIT(c,x) (c[x/8]&(1<<(x%8)))
令我感到不安的是[]
和<<
符号。
但如果你能口口上说出整件事的意义,我会非常感激。
答案 0 :(得分:5)
它将值打包到char数组中。每个数组元素有8位(一个char数组),因此数组的索引由x/8
定义 - 同时1<<(x%8)
正在将一个位与char中的8位相移(x/8
的其余部分) - 因此,如果设置了位x
,则此宏返回非零值,如果不设置则返回0。
答案 1 :(得分:3)
EWWW。如果c
不是derefencable类型且x
不是整数类型,则此宏将失败。另外,没有括号使这更不安全。不是很好的代码。
将x
作为位数转换为c
中包含的内存数组是一件简单的事。 <<
将掩码移位以读取该位,[]
将读取内存。如果数组中的位设置则返回1,否则返回0 - 因此BIT
名称。