我想将整数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;
}
我想知道执行此操作的标准方法,并且如果具有最高优化的现代编译器足够智能,可以将我的代码转换为最快的方法。
答案 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;
}
因此,当使用你的函数时,很明显代码应该这样做,然后查看函数定义,这也很明显为什么除法之后是乘法。