按位异或优化和/或/不使用
我正在研究两种不同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来优化和/或不?