【问题标题】:Equality for two simple expressions with only bitwise operations仅按位运算的两个简单表达式的相等性
【发布时间】: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

标签: algorithm sha1


【解决方案1】:

由于按位运算等效于对各个位的布尔运算,因此您可以简单地通过枚举{x, y, z} 三元组的八个赋值来证明等效性。

分别填写这两个函数的真值表,然后将八个位置相互比较。如果八个位置都匹配,则两个功能是等价的;否则,功能不同。

您也不需要手动执行此操作:将这两个函数插入三个嵌套循环中,将 xyz 的值从零到一(含),并比较调用 @ 的结果987654325@转g(x,y,z)

【讨论】:

  • 你能帮助从一个到另一个的某种转换吗?我之前没有清楚地描述我的目的。如何从一种形式推论到另一种形式,而不仅仅是证明它?
【解决方案2】:

您可以使用Karnaugh Map 执行此操作。鉴于truth table 对应z ^ (x & (y ^ z)),卡诺图是:

可以看出,你可以从图中做两组,给你(x & y) | (~x & z)

【讨论】:

  • 您给出的图表和维基百科上的卡诺图非常有帮助。我现在明白了。谢谢。
猜你喜欢
  • 2015-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
相关资源
最近更新 更多