1. ホーム
  2. c

[解決済み] 整数が偶数か奇数かを調べるにはどうしたらいいですか?[クローズド]

2022-04-24 06:10:35

質問

C言語で与えられた数字が偶数か奇数かを調べるにはどうしたらいいですか?

どのように解決するのですか?

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年間に作られた)非アルカインコンパイラでこのような最適化が行われていないものはないでしょう。他のコンパイラでもテストしてみたいのですが、今は手元にないのです。

もし、他のコンパイラやプラットフォームでテストして、違う結果になる人がいたら、教えて欲しいです。

最後に、モジュロバージョンは 保証 は、整数が正でも負でもゼロでも、符号付き整数の実装に関係なく動作することを規定しています。しかし、ビット単位の演算はそうではありません。2の補数はどこにでもあるものなので、これはあまり問題ではありません。