pax*_*blo 17
只需and使用(64-1)的位反转:
x = x & ~63
// 64 is 000...0001000000
// 63 is 000...0000111111
// ~63 is 111...1111000000
Run Code Online (Sandbox Code Playgroud)
这基本上清除了低六位,这与将其四舍五入为64的倍数相同.请注意,这将向负数的负无穷大舍入,而不是向零,但这似乎是您的问题所需要的.
您可以在此四个变量中看到此处的行为:
#include <stdio.h>
int main (void) {
int i;
for (i = -10; i <= 10; i++) {
printf ("%3d -> %3d\n", i, i & ~3);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这会产生:
-10 -> -12
-9 -> -12
-8 -> -8
-7 -> -8
-6 -> -8
-5 -> -8
-4 -> -4
-3 -> -4
-2 -> -4
-1 -> -4
0 -> 0
1 -> 0
2 -> 0
3 -> 0
4 -> 4
5 -> 4
6 -> 4
7 -> 4
8 -> 8
9 -> 8
10 -> 8
Run Code Online (Sandbox Code Playgroud)
请记住,这仅适用于2的幂(如2 6 = 64)和2的补码(ISO标准不要求表示 - 请参阅此处了解详细信息 - 但我从未见过不使用的C环境它和我一直致力于从最小的8051到最大的大型机系统.如果你想使用任何其他数字作为除数,你应该使用正确的数学函数,如floor.
哪里x是要向下舍到最接近的倍数的数字n,你需要的是方法:
floor(x / n) * n
Run Code Online (Sandbox Code Playgroud)
你可以在C++中很好地实现它(而不是C):
int n = 5;
for (int x = 0; x < 100; x++)
cout << x << " -> " << (x / n) * n << endl;
Run Code Online (Sandbox Code Playgroud)