我在代码库中的实用程序标头中找到了以下宏:
#define CEILING(x,y) (((x) + (y) - 1) / (y))
我在this answer的帮助下)将其解析为:
// Return the smallest multiple N of y such that:
// x <= y * N
但是,无论我多么盯着我们的代码库中如何使用这个宏,我都无法理解这种操作的价值。没有任何用法被评论,这似乎表明它是显而易见的。
有人能为这个宏提供用例的英文解释吗?它可能很明显,我只是看不到它......
答案 0 :(得分:5)
假设你想以块的形式分配内存(想想:缓存行,磁盘扇区);保存包含X
字节的整数块的内存需要多少内存?如果卡盘大小为Y
,则答案为:CEILING(X,Y)
答案 1 :(得分:5)
当您在C中使用整数除法时
y = a / b
你得到的分割结果将舍入为零,即5 / 2 == 2
,-5 / 2 == -2
。有时需要以另一种方式将其舍入为5 / 2 == 3
,例如,如果要采用最小整数数组大小来保存n
字节,则需要对n / sizeof(int)
进行四舍五入,因为您想要空间来容纳那些额外的字节。
所以这个宏就是这样做的:CEILING(5,2) == 3
,但请注意它仅适用于正y
,所以要小心。
答案 2 :(得分:4)
嗯......英文例子......你只能买5个香蕉串。你有47个人想要一个香蕉。你需要多少串?答案=天花板(47,5)=((47 + 5) - 1)/ 5 = 51/5 = 10(丢弃余数 - 整数除法)。
答案 3 :(得分:3)
让我们尝试一些测试值
CEILING(6, 3) = (6 + 3 -1) / 3 = 8 / 3 = 2 // integer division
CEILING(7, 3) = (7 + 3 -1) / 3 = 9 / 3 = 3
CEILING(8, 3) = (8 + 3 -1) / 3 = 10 / 3 = 3
CEILING(9, 3) = (9 + 3 -1) / 3 = 11 / 3 = 3
CEILING(10, 3) = (9 + 3 -1) / 3 = 12 / 3 = 4
如您所见,宏的结果是一个整数,尽可能小z
满足:z * y >= x
。
我们也可以尝试使用符号:
CEILING(k*y, y) = (k*y + y -1) / y = ((k+1)*y - 1) / y = k
CEILING(k*y + 1, y) = ((k*y + 1) + y -1) / y = ((k+1)*y) / y = k + 1
CEILING(k*y + 2, y) = ((k*y + 2) + y -1) / y = ((k+1)*y + 1) / y = k + 1
....
CEILING(k*y + y - 1, y) = ((k*y + y - 1) + y -1) / y = ((k+1)*y + y - 2) / y = k + 1
CEILING(k*y + y, y) = ((k*y + y) + y -1) / y = ((k+1)*y + y - 1) / y = k + 1
CEILING(k*y + y + 1, y) = ((k*y + y + 1) + y -1) / y = ((k+2)*y) / y = k + 2
您可以使用此方法来分配具有常量大小倍数的内存,以确定填充屏幕所需的平铺量等等。
但请注意。这仅适用于正y
。
希望它有所帮助。
答案 4 :(得分:2)
CEILING(x,y)
,{p> y > 0
会给你x/y
(数学除法)的上限。一个用例就是从偏移x
开始的主筛,在这里您将筛选范围内的素数y
的所有倍数标记为复合材料。