[解決済み] ((a + (b & 255)) & 255)と((a + b) & 255)は同じですか?
2023-03-06 09:51:58
質問
C++のコードを見ていたら、以下のようなものがありました。
(a + (b & 255)) & 255
二重のANDに悩まされたので、思いついた。
(a + b) & 255
(
a
と
b
は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
で証明完了。
関連
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] ゲーム「2048」の最適なアルゴリズムとは?
-
[解決済み】C/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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++