【发布时间】:2014-07-06 00:07:37
【问题描述】:
给定以下两个C语言函数:
int f(int x, int y, int z) {
return (x & y) | ((~x) & z);
}
int g(int x, int y, int z) {
return z ^ (x & (y ^ z));
}
对于任何有效整数,这两个函数的结果都是相等的。
我只是想知道这两个表达式之间的数学关系。
我第一次在维基百科的 SHA-1 算法中看到函数 f 的表达式。
http://en.wikipedia.org/wiki/Sha1
在“SHA-1 伪代码”部分,在主循环内:
if 0 ≤ i ≤ 19 then
f = (b and c) or ((not b) and d)
k = 0x5A827999
...
在一些开源实现中,它使用函数g中的形式:z ^ (x & (y ^ z))。
我写了一个程序,对x、y、z所有可能的值进行迭代,所有的结果都是相等的。
如何推导出形式
(x & y) | ((~x) & z)
表格
z ^ (x & (y ^ z))
数学?不仅仅是证明相等性。
【问题讨论】:
-
如果它们相等,那么你可以用基本代数自己算出来:把两者都写出来:
expression1 = expression2,然后将它们简化为最简单的可能形式。如果他们最终在0 = 0,他们是平等的 -
你确定它们对于有符号(即负)值是等价的,并且这不依赖于平台吗?
-
@RakibulHasan 这里的所有操作都完美地表示为对操作数的每一位并行执行的布尔算术。没有人工制品。
-
你需要工作吗? Wolfram Alpha 可以reduce your xor function to DNF。