按位或运算符 | 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中用于对齐内存块的用法[重复]的主要内容,如果未能解决你的问题,请参考以下文章