Ama*_*tam 12 c linux operators bitwise-operators linux-kernel
我无法理解这个宏的作用.这些是定义,linux-kernel
但我怀疑是独立的.我无法理解(((x)+(mask))&~(mask))
线路的作用.
#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
Run Code Online (Sandbox Code Playgroud)
任何帮助赞赏.
oua*_*uah 24
说你有一个号码: 0x1006
出于某些原因,您希望将其与4
字节边界对齐.
随着4字节的边界,你知道对齐值0x1000
,0x1004
,0x1008
,等等,那么你也知道的对齐值0x1006
是0x1008
.
你怎么样的0x1008
?对齐值的对齐掩码4
是(4 - 1) = 0x03
现在0x1006 + 0x03 = 0x1009
和0x1009 & ~0x03 = 0x1008
此操作是 __ALIGN_MASK
宏.
如果要传递值4
(对齐)而不是直接传递0x03
(对齐掩码),则可以使用ALIGN
宏
Dan*_*her 11
#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)
Run Code Online (Sandbox Code Playgroud)
对齐,a
被转换为x
类型,然后减去一个.取向应是2的幂,所以,在许多的位模式的结果00..011..11
的x
的类型,掩模(k
1S如果a = 2^k
).
然后
#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
Run Code Online (Sandbox Code Playgroud)
将掩码的值添加到x
,以使其(x)+ (mask)
至少与对齐的最小倍数一样大,该最小倍数不小于x
且小于下一个较大的倍数.然后,按位和掩码的补码将该数量减少到对齐的倍数.
对于表单的掩码2^k - 1
,计算
(x + mask) & ~mask
Run Code Online (Sandbox Code Playgroud)
是相同的
(x + 2^k - 1) - ((x + 2^k - 1) % (2^k))
Run Code Online (Sandbox Code Playgroud)
要么
((x + 2^k - 1)/(2^k)) * (2^k)
Run Code Online (Sandbox Code Playgroud)