[解決済み] 整数が偶数か奇数かを調べるにはどうしたらいいですか?[クローズド]
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の補数はどこにでもあるものなので、これはあまり問題ではありません。
関連
-
[解決済み] Xcode - 警告。C99 では関数の暗黙の宣言は無効です。
-
[解決済み] 文字列をfloatやintにパースするにはどうしたらいいですか?
-
[解決済み] JavaScriptでカンマを桁区切りにして数値を表示する方法
-
[解決済み] JavaScriptで特定の範囲のランダムな整数を生成する?
-
[解決済み] JavaScriptで文字列を整数に変換する方法は?
-
[解決済み] 0から9までのランダムな整数を生成する
-
[解決済み] Pythonで整数から文字列に変換する
-
[解決済み] int32の最大値は何ですか?
-
[解決済み] 先頭のゼロを含む表示番号
-
[解決済み] Cコードの単体テスト【終了しました
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
VSCodeでCプログラムを書くとエラーになる:ソースファイル "stdio.h" を開くことができない
-
ポインタ定数および定数ポインタ
-
C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
警告:符号付き整数式と符号なし整数式の比較 [-Wsign-compare]
-
[解決済み] munmap_chunk(): 無効なポインタ
-
[解決済み] C言語の書式指定子 %ul と %lu の違いは何ですか?
-
[解決済み] "static const" vs "#define" vs "enum"
-
[解決済み] Cコードの単体テスト【終了しました
-
[解決済み] 演算子 *, /, +, -, % を使わずに 3 で割る。