我正在查看两种不同 MD5 实现的代码,我看到 F(按位三元运算)实现了两种不同的方式:
在 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,因为它是当你听到时要编写的逻辑代码(如果 x 则 y 否则 z)——但我无法想出 f2。
需要明确的是 - 我了解f2 在做什么以及 Xor 是如何工作的 - 我只是无法理解某人如何从 f1 转到 f2 .. 他们怎么知道以这种方式使用 xor 是等效的?
我不能仅仅因为它有效而使用某些东西——我想了解它为什么有效。
有人可以“解释数学”吗?
是否有可以使用 Xor 优化 And/Or/Not 的特定规则?