我不能理解这个宏是做什么的。这些都是在linux-kernel中定义的,但我的怀疑与此无关。我无法理解(((x)+(mask))&~(mask)) line是做什么的。
#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))感谢您的帮助。
发布于 2012-10-29 22:18:38
假设你有一个数字:0x1006
出于某些原因,您希望将其与4字节边界对齐。
使用4字节边界,您知道对齐值为0x1000、0x1004、0x1008等。然后,您还知道0x1006的对齐值为0x1008。
您将如何获取0x1008?对齐值4的对齐掩码为(4 - 1) = 0x03
现在是0x1006 + 0x03 = 0x1009和0x1009 & ~0x03 = 0x1008
此操作是__ALIGN_MASK宏。
如果要传递值4 (对齐)而不是直接传递0x03 (对齐掩码),则可以使用ALIGN宏
发布于 2012-10-29 21:53:54
#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)对齐a转换为x的类型,然后减去1。对齐应该是2的幂,这样就产生了许多x类型的位模式掩码(如果是a = 2^k,则为k1)。
然后
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))将遮罩的值添加到x,以便(x)+ (mask)至少与不小于x且小于下一个较大倍数的对齐的最小倍数一样大。然后,掩码的逐位and和补码将该数字减少到对齐的倍数。
对于表单2^k - 1的掩码,计算
(x + mask) & ~mask等同于
(x + 2^k - 1) - ((x + 2^k - 1) % (2^k))或
((x + 2^k - 1)/(2^k)) * (2^k)https://stackoverflow.com/questions/13122846
复制相似问题