将整数舍入到最接近的int,该整数小于或等于它,并且是64的倍数

ide*_*ikz 7 c math

给定一个整数x,你会如何返回一个小于或等于x的整数y和一个64的倍数?

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.


ici*_*cio 5

哪里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)

  • `cout << x <<" - >"<<(x/n)*n << end;`不是C,我的朋友. (3认同)