猿问

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

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



慕侠2389804
浏览 482回答 3
3回答

12345678_0001

使用modulo(%)运算符检查除以2时是否有余数:if (x % 2) { /* x is odd */ }有几个人批评我上面的回答说明使用x&1是“更快”或“更有效”。我不相信这是事实。出于好奇,我创建了两个简单的测试用例程序:/* modulo.c */#include <stdio.h>int main(void){&nbsp; &nbsp; int x;&nbsp; &nbsp; for (x = 0; x < 10; x++)&nbsp; &nbsp; &nbsp; &nbsp; if (x % 2)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("%d is odd\n", x);&nbsp; &nbsp; return 0;}/* and.c */#include <stdio.h>int main(void){&nbsp; &nbsp; int x;&nbsp; &nbsp; for (x = 0; x < 10; x++)&nbsp; &nbsp; &nbsp; &nbsp; if (x & 1)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("%d is odd\n", x);&nbsp; &nbsp; return 0;}然后我用gcc 4.1.3在我的一台机器上编译了5次不同的时间:没有优化标志。用-O随着-Os用-O2使用-O3我检查了每个编译的汇编输出(使用gcc -S),发现在每种情况下,and.c和modulo.c的输出都是相同的(它们都使用了andl $ 1,%eax指令)。我怀疑这是一个“新”功能,我怀疑它可以追溯到古代版本。我也怀疑任何现代(在过去20年制造)非神秘的编译器,商业或开源,缺乏这样的优化。我会测试其他编译器,但目前我还没有。如果其他人愿意测试其他编译器和/或平台目标,并得到不同的结果,我会非常有兴趣知道。最后,无论实现的有符号整数的表示如何,标准都保证模数版本能够工作,无论整数是正数,负数还是零。按位和版本不是。是的,我意识到两个补码有点无处不在,所以这不是一个真正的问题。

慕运维8079593

你们是waaaaaaaay太高效了。你真正想要的是:public boolean isOdd(int num) {&nbsp; int i = 0;&nbsp; boolean odd = false;&nbsp; while (i != num) {&nbsp; &nbsp; odd = !odd;&nbsp; &nbsp; i = i + 1;&nbsp; }&nbsp; return odd;}重复一遍isEven。当然,这对负数不起作用。但凭借辉煌而牺牲......

弑天下

使用位算术:if((x & 1) == 0)&nbsp; &nbsp; printf("EVEN!\n");else&nbsp; &nbsp; printf("ODD!\n");这比使用除法或模数更快。
随时随地看视频慕课网APP
我要回答