将整数四舍五入到最接近 4 的倍数的标准方法

Jim*_*may 2 c

我想将一个整数舍i入到最接近的 4 倍数。

例如:

0 -> 0
1 -> 0
2 -> 0
3 -> 0
4 -> 4
5 -> 4
6 -> 4
7 -> 4
8 -> 8
9 -> 8
Run Code Online (Sandbox Code Playgroud)

我这样做的明显方法是:

i = (i / 4) * 4;
Run Code Online (Sandbox Code Playgroud)

但是我因为使用​​它而受到批评,因为据说它不清楚,并且看起来像一个错误。

我知道明显的替代方案,按位移位:

i = (i >> 2) << 2;
Run Code Online (Sandbox Code Playgroud)

但我随后意识到有一种完全不同的方法:

(i | 3) - 3
Run Code Online (Sandbox Code Playgroud)

示例程序:

#include <stdio.h>

int main(void) {
    int i;
    for(i = 0; i < 4*4; i++) {
        printf("%d %d %d %d\n", i, (i / 4) * 4, (i >> 2) << 2, (i | 3) - 3);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我想知道执行此操作的标准方法,以及具有最高优化的现代编译器是否足够智能以将我的代码转换为最快的方法。

M.M*_*M.M 6

这是一个见仁见智的问题。我的观点是:

i = (i / 4) * 4;
Run Code Online (Sandbox Code Playgroud)

是最好的方法。这很简单,它显然给出了正确的答案。您编写的任何其他代码,阅读它的人都必须停下来思考它在做什么以及它是否可能有任何不起作用的极端情况。

可能会出现的一个问题是在i消极时该怎么办。C 使用“向零截断”,所以如果i是负数,那么这个表达式给出了在 上做它的负数abs(i)

一个等效的方法是:

i -= (i % 4);
Run Code Online (Sandbox Code Playgroud)

这也简单明了。