我在C中编写了一个内存管理器并尝试确保它已正确对齐(确保用户空间从可被8整除的地址开始,并确保整个块可被整除8以及)。
我想知道是否有人能告诉我这是做什么的:
x = ((x - 1) | 7) + 1;
这是一位朋友向我推荐的代码片段,但我不确定它在做什么/这个场景中垂直条的功能是什么
编辑: 我意识到我可以更清楚地解释这一点; x是一个int,我确实查找它是一个按位OR运算符,但我不明白这意味着什么。谢谢你的帮助!
答案 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,再次满足
以获得更高的值。
感谢大家的建议,这是我的第一个问题,我一定会在将来改进它们!