为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
慕侠2389804 2019-08-30 14:41:24
如何在C中检查给定数字是偶数还是奇数?
查看完整描述

3 回答

?
12345678_0001

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年制造)非神秘的编译器,商业或开源,缺乏这样的优化。我会测试其他编译器,但目前我还没有。


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


最后,无论实现的有符号整数的表示如何,标准都保证模数版本能够工作,无论整数是正数,负数还是零。按位和版本不是。是的,我意识到两个补码有点无处不在,所以这不是一个真正的问题。


查看完整回答
反对 回复 2019-08-30
?
慕运维8079593

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。


当然,这对负数不起作用。但凭借辉煌而牺牲......


查看完整回答
反对 回复 2019-08-30
?
弑天下

TA贡献1818条经验 获得超8个赞

使用位算术:


if((x & 1) == 0)

    printf("EVEN!\n");

else

    printf("ODD!\n");

这比使用除法或模数更快。


查看完整回答
反对 回复 2019-08-30
  • 3 回答
  • 0 关注
  • 481 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信