2 つの異なる MD5 実装のコードを調べていたところ、F (ビットごとの 3 項演算) が 2 つの異なる方法で実装されていることがわかりました。
Cで:
#define f1(x, y, z) (((x) & (y)) | (~(x) & (z)))
#define f2(x, y, z) ((z) ^ ((x) & ((z) ^ (y))))
擬似的に:
f1 = (x And y) Or ((Not x) And z)
f2 = z Xor (x And (z Xor y))
私が理解できないのは、そもそも誰かがどのようにして f2 を思いついたのかということです。f1 は (if x then y else z) と聞いたときに記述する論理コードであるため、自分で f1 を考え出すこともできましたが、f2 を思い付くことはできませんでした。
明確にするために-私はf2が何をしているか、Xorがどのように機能するかを理解しています-誰かがf1からf2に移動する方法を理解できません..そのようにxorを使用することが同等であることをどのように知ったのですか?
機能するからといって、何かを使用することはできません。なぜ機能するのかを理解したいのです。
いわば、誰かが「数学を説明」できますか?
And/Or/Not を最適化するために Xor を使用できる特定のルールはありますか?