啥叫倍数的向上取整与向下取整呢?
举个例子,你有一个函数,用来分配一块内存,为了提高运行速度,要对内存大小进行对齐。
function NewMemBlock(const BlockSize, AlignSize: Integer): Pointer;
var
NewSize: Integer;
begin
NewSize := ...
GetMem(Result, NewSize);
end;
假设 BlockSize = 10,AlignSize = 8
所谓向下取整,即 NewSize = 8,是很简单的:
NewSize := BlockSize div AlignSize * AlignSize;
// 10 div 8 * 8 => 1 * 8 => 8
这是因为 div 只会取结果的整数部分而忽略小数部分。
向上取整则需要判断余数,余数不为 0 则需要补齐缺少的部分:
// 0.
NewSize := BlockSize;
if BlockSize mod AlignSize <> 0 then
Inc(NewSize, AlignSize - BlockSize mod AlignSize);
// 10 mod 8 <> 0 => Inc(NewSize, 8 - 10 mod 8) => Inc(10, 6) => 16
这个代码能达到目的,但是显得很繁琐,我们来简化一下,下面几种方法都可以实