我在一篇文章中读到一种技术,可以让你将数字 X 向上舍入,使其成为 Y 的倍数。
int roundup(int x, int y) {
return ((x+y-1) & ~(y-1));
}
int main() {
int x = 1020; // number to round up
x = roundup(x, 512);
return 0;
}
此代码示例将 X 舍入为 1024,但它没有解释舍入函数中发生的情况,因此我要求对此进行解释。
我在一篇文章中读到一种技术,可以让你将数字 X 向上舍入,使其成为 Y 的倍数。
int roundup(int x, int y) {
return ((x+y-1) & ~(y-1));
}
int main() {
int x = 1020; // number to round up
x = roundup(x, 512);
return 0;
}
此代码示例将 X 舍入为 1024,但它没有解释舍入函数中发生的情况,因此我要求对此进行解释。
这在四舍五入到 2 的幂时有效,而不是任何数字。但是,通常需要这样的舍入。
增加数字 x,使结果至少是 y 的倍数(包括 x!),但不会达到下一个倍数。例如,y=4
反转
对括号中的数字进行此操作
y=2^k会产生带有单位尾部的二进制数,这些单位的数量对应于 2 的幂kk当它倒置时,得到了一些尾部为零的1 。当执行 AND 运算时,
k最后的位被重置为零,这就是多重性yHarry 已经写了一个更通用的整数除法版本
中的秘密
&~(y-1),它在末尾重置位,即 本质上执行除法,y然后乘以它,并提供是 的倍数的结果y。顺便说一句,此选项适用于 other
y,而不仅仅是 2 的幂。