我无法理解这个macros是什么。 这些是在linux-kernel
中定义的,但是我的疑问是独立于此的。 我无法理解(((x)+(mask))&~(mask))
行是干什么的。
#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1) #define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
任何帮助赞赏。
假设你有一个数字: 0x1006
由于某些原因,您希望将其与4
个字节的边界对齐。
用一个4字节的边界,你知道对齐的值是0x1008
等。然后你也知道0x1006
的对齐值是0x1008
。
你将如何得到0x1008
? 对齐值4
的对齐掩码是(4 - 1) = 0x03
现在0x1006 + 0x03 = 0x1009
和0x1009 & ~0x03 = 0x1008
这个操作是__ALIGN_MASK
宏。
如果你想传递值4
(对齐)而不是直接0x03
(对齐掩码),你有ALIGN
宏
#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)
对齐方式a
被转换为x
的类型,然后减去一个。 对齐应该是2的幂,从而产生许多x
型的位模式00..011..11
,掩码(如果a = 2^k
,则k
1s)。
然后
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
将该掩码的值添加到x
,使得(x)+ (mask)
至少与不小于x
且小于下一个较大倍数的对齐的最小倍数一样大。 然后,该掩码的逐位和补码将该数量减少到该对齐的倍数。
对于2^k - 1
形式的掩码,计算
(x + mask) & ~mask
是相同的
(x + 2^k - 1) - ((x + 2^k - 1) % (2^k))
要么
((x + 2^k - 1)/(2^k)) * (2^k)