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

时间:2014-11-24 22:46:07

标签: c

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

例如:

0 -> 0
1 -> 0
2 -> 0
3 -> 0
4 -> 4
5 -> 4
6 -> 4
7 -> 4
8 -> 8
9 -> 8

我这样做的显而易见的方法是:

i = (i / 4) * 4;

但是我被批评使用这个因为据说它不清楚,看起来像是一个错误。

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

i = (i >> 2) << 2;

但我后来意识到完全有不同的方法:

(i | 3) - 3

示例程序:

#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;
}

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

2 个答案:

答案 0 :(得分:4)

这是一个意见问题。我的意见是:

i = (i / 4) * 4;

是最好的方式。它很简单,显然给出了正确的答案。你写的任何其他代码,有人阅读它将不得不停下来思考它正在做什么,以及它是否有任何不起作用的角落案例。

可能出现的一个问题是当i为否定时该怎么做。 C使用“截断为零”,因此如果i为负数,则此表达式会在abs(i)上给出否定的结果。

等效方式是:

i -= (i % 4);

这也很简单明了。

答案 1 :(得分:2)

创建一个以一种明确的方式命名的函数,并且使用这个函数:

static inline int roundToMultipleOf4(int v){
  return (v/4)*4;
}

因此,当使用你的函数时,很明显代码应该这样做,然后查看函数定义,这也很明显为什么除法之后是乘法。