0

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 を使用できる特定のルールはありますか?

4

0 に答える 0