<分区>
如何在 C 中检查给定数字是偶数还是奇数?
<分区>
如何在 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 次不同的时间:
我检查了每次编译(使用 gcc -S)的汇编输出,发现在每种情况下,and.c 和 modulo.c 的输出都是相同的(它们都使用了 andl $1, %eax 指令)。我怀疑这是一个"new"功能,我怀疑它可以追溯到古代版本。我也怀疑任何现代(过去 20 年制造的)非神秘编译器,无论是商业的还是开源的,都缺乏这种优化。我会在其他编译器上进行测试,但目前没有可用的编译器。
如果其他人愿意测试其他编译器和/或平台目标,并得到不同的结果,我会很想知道。
最后,标准保证模数版本可以工作,无论整数是正数、负数还是零,无论实现的有符号整数表示形式如何。按位与版本不是。是的,我意识到二进制补码在某种程度上无处不在,所以这不是真正的问题。
关于c - 如何检查整数是偶数还是奇数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/160930/