如何理解ACC_MODE的宏?

时间:2013-11-03 06:45:47

标签: c kernel

代码是:

#define O_ACCMODE       00000003
#define ACC_MODE(x) ("\000\004\002\006"[(x)&O_ACCMODE])

如何理解?
谢谢。

2 个答案:

答案 0 :(得分:4)

"\000\004\002\006"定义了4个字节/字符的数组,我们可以将其替换为:

char array[4] = {0, 4, 2, 6};

x& 3表示 - 在整数中只得到最右边的2位,基本上等于x%4

所以,这个宏做:array[ x % 4 ] - 根据索引

获取适当的值

答案 1 :(得分:3)

宏实现了函数

(x % 4) == 0   --> (char)0
(x % 4) == 1   --> (char)4
(x % 4) == 2   --> (char)2
(x % 4) == 3   --> (char)6

它使用按位和运算来使x中的所有位无效,除了两个最低有效位(这相当于x%4)。然后使用result作为索引从char数组中提取值。

等效代码是

char ACC_MODES[] = {'\000', '\004', '\002', '\006'} // array of 4 chars
#define O_ACCMODE 00000003
#define USE_LOWEST_TWO_BITS(x) ((x)&O_ACCMODE) // masks (that is sets to zero) all bits except two lest significant, the equivalent operation is (x % 4)
#define ACC_MODE(x) (ACC_MODES[USE_LOWEST_TWO_BITS(x)])