c - 将整数向下舍入到最接近的 4 倍数的标准方法

标签 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;
}

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

最佳答案

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

i = (i / 4) * 4;

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

可能出现的一个问题是当i 为负数时该怎么办。 C 使用“向零截断”,因此如果 i 为负数,则此表达式给出对 abs(i) 执行此操作的负数。

一个等效的方法是:

i -= (i % 4);

也简单明了。

关于c - 将整数向下舍入到最接近的 4 倍数的标准方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27115595/

相关文章:

c - 为什么我可以在 C 中用一个参数定义函数时调用不带参数的函数?

标准的字符串文字和字符串文字?

c - fgets() 将字符串分成两行

c - 修改后指针没有改变

c - 如何从 char、int 和 float 类型的指针值构造 char 数组 (C)

c - 是否可以想象,严格按照C11(或以上)标准的规定,这个程序可以优化为打印hello?

c - 有没有一种简单的方法可以从源代码中找到哪些其他函数可以调用某个函数?

子进程从其父进程继承句柄但无法写入其中

c - 如何识别用户空间和内核空间之间的特定套接字?

c - Visual Studio 2010 中的 Langinfo.h