1

代码是:

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

怎么理解?
谢谢你。

4

2 回答 2

4

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

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

x&3 表示 - 仅获得最右边的 2 位整数,基本上相当于x%4

所以,这个宏做:array[ x % 4 ]- 根据索引取适当的值

于 2013-11-03T06:54:15.620 回答
3

宏实现功能

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

它使用按位和运算来取消x除两个最低有效位之外的所有位(这相当于 x % 4)。然后使用结果作为索引从 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)]) 
于 2013-11-03T07:01:44.857 回答