3 回答
TA贡献1802条经验 获得超5个赞
使用modulo(%)运算符检查除以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年制造)非神秘的编译器,商业或开源,缺乏这样的优化。我会测试其他编译器,但目前我还没有。
如果其他人愿意测试其他编译器和/或平台目标,并得到不同的结果,我会非常有兴趣知道。
最后,无论实现的有符号整数的表示如何,标准都保证模数版本能够工作,无论整数是正数,负数还是零。按位和版本不是。是的,我意识到两个补码有点无处不在,所以这不是一个真正的问题。
TA贡献1876条经验 获得超5个赞
你们是waaaaaaaay太高效了。你真正想要的是:
public boolean isOdd(int num) {
int i = 0;
boolean odd = false;
while (i != num) {
odd = !odd;
i = i + 1;
}
return odd;
}
重复一遍isEven。
当然,这对负数不起作用。但凭借辉煌而牺牲......
- 3 回答
- 0 关注
- 481 浏览
添加回答
举报