小编典典

如何检查整数是偶数还是奇数?

all

如何检查给定数字在C中是偶数还是奇数?


阅读 72

收藏
2022-07-14

共1个答案

小编典典

使用模 (%) 运算符检查除以 2 时是否有余数:

if (x % 2) { /* x is odd */ }

一些人批评了我上面的回答,说使用 x & 1 是“更快”或“更有效”。我不相信是这样的。

出于好奇,我创建了两个简单的测试用例程序:

/* modulo.c */
#include <stdio.h>

int main(void)
{
    int x;
    for (x = 0; x < 10; x++)
        if (x % 2)
            printf("%d is odd\n", x);
    return 0;
}

/* and.c */
#include <stdio.h>

int main(void)
{
    int x;
    for (x = 0; x < 10; x++)
        if (x & 1)
            printf("%d is odd\n", x);
    return 0;
}

然后我在我的一台机器上用 gcc 4.1.3 编译了 5 次:

  • 没有优化标志。
  • 带-O
  • 带 -Os
  • 与 -O2
  • 与-O3

我检查了每次编译的汇编输出(使用 gcc -S),发现在每种情况下,and.c 和 modulo.c 的输出都是相同的(它们都使用了 andl $1,
%eax 指令)。我怀疑这是一个“新”功能,我怀疑它可以追溯到古代版本。我也怀疑任何现代(过去 20
年制造的)非神秘编译器,无论是商业的还是开源的,都缺乏这种优化。我会在其他编译器上进行测试,但目前我没有任何可用的。

如果其他人愿意测试其他编译器和/或平台目标,并得到不同的结果,我很想知道。

最后,标准保证
模版本无论整数是正数、负数还是零都可以工作,而不管实现对有符号整数的表示。按位与版本不是。是的,我意识到二进制补码无处不在,所以这不是一个真正的问题。

2022-07-14