这个功能像宏一样意味着什么?

时间:2013-04-12 16:14:39

标签: c macros c-preprocessor

我是一名相对优秀的 C 程序员,我喜欢做研究而不喜欢提问,但这段特别的代码简直令人不安。 它与XQueryKeymap一起使用,但我根本不理解它:

#define BIT(c,x) (c[x/8]&(1<<(x%8)))

令我感到不安的是[]<<符号。 但如果你能口口上说出整件事的意义,我会非常感激。

2 个答案:

答案 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名称。