[解決済み] if-elseや他の比較演算子を使わずに2つの整数の最大値を求めるこのスニペットを説明してください。
質問
2つの数値の最大値を求めよ。if-elseや他の比較演算子は使ってはいけない。ネットの掲示板でこの質問を見つけたので、StackOverflowで質問してみようと思います。
例題 入力。5, 10 出力 10
私はこの解決策を見つけました。どなたか、これらのコードの行を理解するのを助けていただけませんか。
int getMax(int a, int b) {
int c = a - b;
int k = (c >> 31) & 0x1;
int max = a - k * c;
return max;
}
どのように解決するのですか?
int getMax(int a, int b) {
int c = a - b;
int k = (c >> 31) & 0x1;
int max = a - k * c;
return max;
}
これを分解してみましょう。 この最初の行は簡単そうに見えます。
a
と
b
. の場合、この値は負になります。
a < b
の場合は負で、それ以外の場合は非負である。しかし、実はここにバグがある。もし、数値の差が
a
と
b
が整数に収まらないほど大きい場合、これは未定義の動作につながります - おっと!?ということで、ここではそうならないことを前提にしましょう。
次の行で、これは
int k = (c >> 31) & 0x1;
の値をチェックすることです。
c
が負であるかどうかを調べることです。 事実上すべての現代のコンピュータでは、数値は
2の補数
と呼ばれる形式で保存され、数値の最上位ビットが正の場合は 0、負の場合は 1 になります。 さらに、ほとんどの int は 32 ビットである。
(c >> 31)
は、数値の最上位ビットを最下位ビットの場所に残したまま、数値を31ビット下にシフトします。 次のステップでは、この数字を取り出し、1(その2進表現は最後のビット以外すべて0)と AND 演算することで、上位ビットをすべて消去し、最下位ビットだけを取得します。 の最下位ビットは
c >> 31
の最上位ビットである
c
の最上位ビットを読み取ります。
c
の最上位ビットを 0 か 1 のどちらかとして読み取ります。 最上位ビットが1である場合
c
が1であれば最上位ビットは1なので、これは
c
が負(1)であるか正(0)であるかをチェックする方法である。 この理屈と上記の理屈を組み合わせると
k
が1であれば
a < b
の場合は1、それ以外の場合は0となります。
最終的にはこうなります。
int max = a - k * c;
もし
a < b
であれば
k == 1
となり
k * c = c = a - b
というように
a - k * c = a - (a - b) = a - a + b = b
というのは、正しい最大値です。
a < b
. そうでなければ、もし
a >= b
であれば
k == 0
となり
a - k * c = a - 0 = a
というのも正しい最大値です。
関連
-
g++が内部・外部コマンドソリューションとして認識されない、MinGWを初めて使うときの落とし穴
-
C++の配列コピー
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] munmap_chunk(): 無効なポインタ
-
[解決済み] stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] c または c++ 用のシンプルな 2 次元クロスプラットフォームグラフィックスライブラリ?[クローズド]
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] なぜ、ハッシュを組み合わせるのにXORがデフォルトなのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
C: 1を求める! + 2! + 3! + ... + n! (ループ)
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] C言語で%sを正しく使う - 超基本レベル
-
[解決済み] なぜmemsetではなくbzeroを使用するのですか?
-
[解決済み] C言語でランダムなint型を生成するには?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?