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

标签 c integer

<分区>

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

最佳答案

使用模 (%) 运算符检查除以 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 指令)。我怀疑这是一个"new"功能,我怀疑它可以追溯到古代版本。我也怀疑任何现代(过去 20 年制造的)非神秘编译器,无论是商业的还是开源的,都缺乏这种优化。我会在其他编译器上进行测试,但目前没有可用的编译器。

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

最后,标准保证模数版本可以工作,无论整数是正数、负数还是零,无论实现的有符号整数表示形式如何。按位与版本不是。是的,我意识到二进制补码在某种程度上无处不在,所以这不是真正的问题。

关于c - 如何检查整数是偶数还是奇数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/160930/

相关文章:

java - JNI 报告 Android 中 GetByteArrayElements 的间接引用无效

c - 无论输入是什么,If 语句的主体都会运行

c - 在Arduino IDE中将浮点值转换为科学记数法的语法?

Java RegEx - 对于不包含 "."的整数

c - 链接器为 rodata 部分计算了错误的地址

ios - 在 macOS 中创建 C 定时器

java - 获取 Int 的后三位

c++ - 整数年;即将出现 -2 但我还没有给它赋值

Java 大整数

c - 在 C 中使用 enum 和 int 变量的区别