按位或运算符 | C中用于对齐内存块的用法[重复]

Posted

技术标签:

【中文标题】按位或运算符 | C中用于对齐内存块的用法[重复]【英文标题】:Bitwise or operator | usage in C for aligning memory blocks [duplicate] 【发布时间】:2016-07-05 23:49:00 【问题描述】:

我正在用 C 语言编写内存管理器,并试图确保它正确对齐(确保用户空间从可被 8 整除的地址开始,并确保整个块也可被 8 整除)。

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

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

这是一个朋友向我建议的代码片段,但我不确定它在做什么/垂直条在这种情况下的功能是什么

编辑: 我意识到我可以更清楚地解释这一点。 x 是一个整数,我确实查到它是一个按位或运算符,但我不明白在这种情况下这是什么意思。感谢您的帮助!

【问题讨论】:

*** 并不是学习语言基础知识的最佳场所。查阅基本的 C 教程或书籍。至于你的具体问题,| 是bitiwise OR operator。 你为什么不问问你的朋友? 看起来不对。至少使用int 值是个坏主意。 @kaylum 我不认为这是真正的“语言基础”,如何正确地编写表达式来对齐记忆,或者理解一个表达式来做到这一点,当然不是微不足道的。我认为这是一个有效的问题,即使它可能更清楚一点。 @Curtis x 的类型是什么?它应该是块的长度还是地址? 【参考方案1】:

使一个数能被 8 整除的标准方法是:

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

这应该比你朋友的构造更容易理解(顺便说一句,它可能也有效,但见下文)。

您的构造通过将数字与 7 进行按位或运算来设置数字的低 3 位(从而创建一个除以 8 时余数为 7 的数字),然后加 1 使其可被 8 整除。 -1 表示,您应该自己锻炼。如果您乍一看不了解它的作用,我什至不会看它或使用它。

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

【讨论】:

【参考方案2】:

该语句在 if 语句中,如下所示:

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

我最初应该在代码片段中包含更多内容,对此深表歉意。稍微回顾一下我的二进制数学后,我意识到“| 7”表示与 0111 的 OR,并且鉴于这是在 x 被认为未对齐时使用的语句,结果只能如下:

如果 (x-1)

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

以此类推以获得更高的值。

感谢大家的建议,这是我的第一个问题,以后我一定会改进的!

【讨论】:

以上是关于按位或运算符 | C中用于对齐内存块的用法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C语言中位移位运算符?

按位与&按位或|按位异或^

按位与,按位或,按位异或,按位取反

C语言里的按位异或运算符

巧妙运用 按位或“|” 运算

常量的按位或