整数が偶数か奇数かを確認するにはどうすればよいですか?

モジュロ (%) 演算子を使用して、2 で割ったときに剰余があるかどうかを確認します:

if (x % 2) { /* x is odd */ }

x &1 を使用すると「より高速」または「より効率的」であると述べて、上記の私の回答を批判する人が何人かいます。私はこれが事実であるとは思わない。

好奇心から、2 つの簡単なテスト ケース プログラムを作成しました。

/* 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;
}

次に、これらを私のマシンの 1 つで gcc 4.1.3 を使用して 5 回コンパイルしました。

  • 最適化フラグなし
  • -O を使用
  • -Os を使用
  • -O2 あり
  • -O3 を使用

(gcc -S を使用して) 各コンパイルのアセンブリ出力を調べたところ、いずれの場合も、and.c と modulo.c の出力が同一であることがわかりました (どちらも andl $1, %eax 命令を使用していました)。これが「新しい」機能であるとは思えず、古いバージョンにまでさかのぼると思われます。また、最新の (過去 20 年間に作成された) 非難解なコンパイラ、商用またはオープン ソースに、そのような最適化が欠けているとは思えません。他のコンパイラでテストしたいのですが、現時点では利用できるものはありません.

他のコンパイラやプラットフォーム ターゲットをテストして別の結果を得たいという人がいれば、ぜひ知りたいと思います。

最後に、モジュロ バージョンは保証されています 符号付き整数の実装の表現に関係なく、整数が正、負、またはゼロのいずれであっても機能するように標準で規定されています。 bitwise-and バージョンはそうではありません。はい、2 の補数はどこにでもあるので、これは問題ではありません。


あなたたちは効率が良すぎるわあああああ。あなたが本当に欲しいものは:

public boolean isOdd(int num) {
  int i = 0;
  boolean odd = false;

  while (i != num) {
    odd = !odd;
    i = i + 1;
  }

  return odd;
}

isEven について繰り返します .

もちろん、それは負の数では機能しません。しかし、輝きには犠牲が伴います...


ビット演算を使用:

if((x & 1) == 0)
    printf("EVEN!\n");
else
    printf("ODD!\n");

これは、除算やモジュラスを使用するよりも高速です。