首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对齐宏内核

对齐宏内核
EN

Stack Overflow用户
提问于 2012-10-29 21:46:00
回答 2查看 19.1K关注 0票数 15

我不能理解这个宏是做什么的。这些都是在linux-kernel中定义的,但我的怀疑与此无关。我无法理解(((x)+(mask))&~(mask)) line是做什么的。

代码语言:javascript
复制
#define ALIGN(x,a)              __ALIGN_MASK(x,(typeof(x))(a)-1)
#define __ALIGN_MASK(x,mask)    (((x)+(mask))&~(mask))

感谢您的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-29 22:18:38

假设你有一个数字:0x1006

出于某些原因,您希望将其与4字节边界对齐。

使用4字节边界,您知道对齐值为0x10000x10040x1008等。然后,您还知道0x1006的对齐值为0x1008

您将如何获取0x1008?对齐值4的对齐掩码为(4 - 1) = 0x03

现在是0x1006 + 0x03 = 0x10090x1009 & ~0x03 = 0x1008

此操作是__ALIGN_MASK宏。

如果要传递值4 (对齐)而不是直接传递0x03 (对齐掩码),则可以使用ALIGN

票数 29
EN

Stack Overflow用户

发布于 2012-10-29 21:53:54

代码语言:javascript
复制
#define ALIGN(x,a)              __ALIGN_MASK(x,(typeof(x))(a)-1)

对齐a转换为x的类型,然后减去1。对齐应该是2的幂,这样就产生了许多x类型的位模式掩码(如果是a = 2^k,则为k1)。

然后

代码语言:javascript
复制
#define __ALIGN_MASK(x,mask)    (((x)+(mask))&~(mask))

将遮罩的值添加到x,以便(x)+ (mask)至少与不小于x且小于下一个较大倍数的对齐的最小倍数一样大。然后,掩码的逐位and和补码将该数字减少到对齐的倍数。

对于表单2^k - 1的掩码,计算

代码语言:javascript
复制
(x + mask) & ~mask

等同于

代码语言:javascript
复制
(x + 2^k - 1) - ((x + 2^k - 1) % (2^k))

代码语言:javascript
复制
((x + 2^k - 1)/(2^k)) * (2^k)
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13122846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档