1. ホーム
  2. c++

[解決済み] ((a + (b & 255)) & 255)と((a + b) & 255)は同じですか?

2023-03-06 09:51:58

質問

C++のコードを見ていたら、以下のようなものがありました。

(a + (b & 255)) & 255

二重のANDに悩まされたので、思いついた。

(a + b) & 255

( ab は32ビット符号なし整数)

早速、自分の理論を確認するためにテストスクリプト(JS)を書いてみました。

for (var i = 0; i < 100; i++) {
    var a = Math.ceil(Math.random() * 0xFFFF),
        b = Math.ceil(Math.random() * 0xFFFF);

    var expr1 = (a + (b & 255)) & 255,
        expr2 = (a + b) & 255;

    if (expr1 != expr2) {
        console.log("Numbers " + a + " and " + b + " mismatch!");
        break;
    }
}

スクリプトは私の仮説(両方の操作が等しい)を確認しましたが、私はまだそれを信用していません、なぜなら1) ランダム であり、2) 私は数学者ではないからです。 何をやっているのかさっぱりわからない .

また、Lisp的なタイトルで申し訳ありません。ご自由に編集してください。

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

同じです。以下はその証明です。

まず、恒等式に注目してください。 (A + B) mod C = (A mod C + B mod C) mod C

について、問題を再定義してみましょう。 a & 255 の代わりとして a % 256 . これは a は符号無しだからです。

そのため (a + (b & 255)) & 255(a + (b % 256)) % 256

と同じで、これは (a % 256 + b % 256 % 256) % 256 と同じです (上に述べた恒等式を適用しています。 mod% は符号なし型では等価です)。

これは以下のように単純化されます。 (a % 256 + b % 256) % 256 となり (a + b) % 256 (となります(恒等式を再適用)。次にビット演算子を戻すと

(a + b) & 255

で証明完了。