向上取整算法

Posted GunLun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了向上取整算法相关的知识,希望对你有一定的参考价值。

在进行内存分配的时候一般都需要在实际使用内存大小的基础上进行内存对齐,比如一般32位平台进行4字节对齐,而64位平台使用8字节对齐等等。
一般采用的算法是先利用公式
$int(\frac{a + b - 1} { b})$(其中a是实际使用的内存, b是对齐值)
然后根据这个值乘以b即可得到对应的对齐值

公式推导

$$ 假设 A = NB +M (M \in \left[0,B-1\right])$$

$$\because\frac{A}{B} = N + \frac{M}{B}$$

$$\because M \in\left[0, B-1\right]$$

$$\therefore \frac{A}{B} \leq \frac{NB +B -1}{B} \leq \frac{A + B -1}{B}$$

从上面可以得出$$\frac{A}{B}$$向上取整可能是int($$\frac{A+B-1}{B}$$)但是具体是否有比它小的整数,仍然不能确定.因此我们根据推导一下这个结果与$$\frac{A}{B}$$向上取整的结果是否相同

$$ 假设 A = NB +M (M \in \left[0,B-1\right])$$

$$当M = 0时UP(\frac{A}{B}) = N$$

$$当M \neq 0时,UP(\frac{A}{B}) = N$$

而针对int($$\frac{A+B-1}{B}$$)的结果

$$当M = 0时int(\frac{A+B-1}{B} )=int(\frac{NB+B -1}{B}) = int(N + 1 - \frac{1}{B}) $$

$$\because \frac{1}{B} < 1$$

$$\therefore int(\frac{A+B-1}{B} )$$

$$当 M \neq 0 时int(\frac{A+B-1}{B} ) = int(\frac{NB +M + B -1}{B}) = int(N + 1 + \frac{M-1}{B})$$

$$当M = 1时 int(\frac{A+B-1}{B} ) = int(N + 1 + \frac{M-1}{B}) = N + 1$$

$$当1 < M \leq B-1时 \frac{M -1}{B} < 1$

$\therefore int(\frac{A+B-1}{B} ) = int(N + 1 + \frac{M-1}{B}) = N$$

从上面的推导来看二者的值完全相同所以可以得出结论

$$UP(\frac{A}{B}) = int(\frac{A + B - 1}{B})$$

所以当我们对A字节的内存进行B字节的对齐时可以使用公式

$$int(\frac{A + B - 1}{B}) \times B $$

补充

其实还有一个算法

long(A + B - 1) &~ (B - 1)

也可以计算,但是我没有弄清楚它的原理是什么,暂时不管先记住再说^_^
这里对数学公式的支持不太好,如果想看完整的点击这里

以上是关于向上取整算法的主要内容,如果未能解决你的问题,请参考以下文章

DIV_ROUND_UP(x,y)实现x/y向上取整

向上取整ceil()

在java中怎么对一个数字取整?

二分查找算法

二分查找算法

最坏情况为线性时间的选择算法