按位或运算符|在C中用于对齐内存块的用法

时间:2016-03-19 04:05:10

标签: c memory memory-management

我在C中编写了一个内存管理器并尝试确保它已正确对齐(确保用户空间从可被8整除的地址开始,并确保整个块可被整除8以及)。

我想知道是否有人能告诉我这是做什么的:

x = ((x - 1) | 7) + 1;

这是一位朋友向我推荐的代码片段,但我不确定它在做什么/这个场景中垂直条的功能是什么

编辑: 我意识到我可以更清楚地解释这一点; x是一个int,我确实查找它是一个按位OR运算符,但我不明白这意味着什么。谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

使数字可被8整除的标准方法是:

len = (len + 7) & 0xfffffff8; /* for positive 32-bit values */

这应该比你朋友的结构更容易理解(BTW可能也有效,但见下文)。

你所使用的构造通过对它进行按位OR运算来设置数字的低3位(因此创建一个数字,当除以8时,余数为7),然后加1使其可被8整除。 -1意味着,你应该自己解决。如果你不了解乍一看它的作用,我甚至不会看它,也不会使用它。

是否建议使用有符号整数作为地址和块长度,你肯定会得到一些其他的评论。

答案 1 :(得分:0)

此语句位于if语句中,如下所示:

if (x % 8 != 0):
    x = ((x - 1) | 7) + 1;

我应该最初在代码片段中包含更多内容,为此道歉。一旦我稍微检查了我的二进制数学,我就认识到“| 7”意味着与0111的OR,并且假设这是当x被认为是未对齐时使用的语句,结果只能如下:

if(x-1)< 7 :((x-1)| 7)是0111.加1得到8,满足条件。

如果15> (x-1)> 7:((x-1)| 7)是1111.加1得到16,再次满足

以获得更高的值。

感谢大家的建议,这是我的第一个问题,我一定会在将来改进它们!