数据对齐的2的幂的倍数

| TinyPE的汇编源代码中包含一个“简单”的简单数学公式,用于数据对齐,该地址来自以下地址: http://www.phreedom.org/solar/code/tinype/ 这是公式:
%define round(n, r) (((n+(r-1))/r)*r)
我知道它的主要目的是在r = 8时使n = 31之类的数字与round(n,r)== 32之类的东西对齐。 我知道n表示预期的数字,r是四舍五入的“基数”倍数。我也知道,由于它是简单的汇编源代码,所有操作仅返回整数,因此方便地丢失了任何小数,因此不会导致任何计算“错误”。 问题是以下解释是否正确,或者是否有更好,更正确的解释。我不想盲目使用摘要,我可能会以某种方式误解。 另外,我本来希望使用number +(round%(number%round)),但是当\“ number \”是\“ round \”的精确倍数时,它将导致被零除。 此公式获得数字的最接近倍数,即2的幂。 在此示例中,我们的数字为31,而我们希望具有的数字为“底数”为8。它将返回32:
(((31+(8-1))/8)*8)
首先,我们得到8-1,得出7。我们将其加到31,得出38。 然后我们除以38/8,得出4.75。由此,整数值为4。 该4乘以8,得出32。 每个公式部分的逻辑/数学意图如下: -8-1部分使多余的部分存在,无论原始数字(在这种情况下为31)是否是基本舍入数字(在这种情况下为8)的倍数,并且得出的范围是7非整数和可能的倍数。 -1导致我们没有通过右移至下一个非最近倍数而得到错误的计算,但是它仅给出了不精确的余量来检测其余的先前“因素”。 -通过将超出的数字除以基本倍数(在这种情况下为8),就可以得到整数。我们添加的多余部分使该数字与最近的倍数对齐,如果它在立即数范围内而又不增加两个倍数(因此为-1)。 -通过将此因子的纯整数部分(在这种情况下为4)乘以基本倍数r(在这种情况下为8),我们得到精确的最接近的倍数,而无需进行下一个乘法。例如,从31开始的最接近的8的倍数是32,而不是40。     
已邀请:
我不太确定我是否理解您的问题,但是如果您希望找到最接近给定数字x的n的幂,可以尝试 n ^(舍入(ln(x)/ ln(n))     

要回复问题请先登录注册