术语和代码行的平等

Equality of term and codeline

任何人都可以一步一步地向我解释,这个平等是如何成立的?

((a^b)&~b)|(~(a^b)&b)  == a

最好的方法是什么?

要检查的程序:

#include <stdio.h>

int main()
{
  int a, b;

  for (a = 0; a != 2; ++a) {
    for (b = 0; b != 2; ++b) {
      printf("((%d^%d)&~%d)|(~(%d^%d)&%d) = %d (a=%d, b=%d)\n",
             a,b,b,a,b,b, ((a^b)&~b)|(~(a^b)&b), a,b);
    }
  }

  return 0;
}

执行产生:

((0^0)&~0)|(~(0^0)&0) = 0 (a=0, b=0)
((0^1)&~1)|(~(0^1)&1) = 0 (a=0, b=1)
((1^0)&~0)|(~(1^0)&0) = 1 (a=1, b=0)
((1^1)&~1)|(~(1^1)&1) = 1 (a=1, b=1)

数学解释看RbMm的备注

简单地开发异或并简化:

((a^b) & ~b) | (~(a^b) & b) ==
((a|b) & (~a|~b) & ~b) | ((a|~b) & (~a|b) & b) ==
((a|b) & ~b) | ((a|~b) & b) ==
a | a ==
a

另一种查看方式是定义f(a, b) = (a^b) & ~b。 该语句变为 f(a, b) | f(a, ~b),因此您只需简化 f(a, b):

f(a, b) ==
(a^b) & ~b ==
(a|b) & (~a|~b) & ~b ==
(a|b) & ~b ==
a

所以 f(a, b) = a 不管 b 是什么,而 f(a, b) | f(a, ~b) 就是 a | a == a.

(X&~Y)|(~X&Y) == X^Y //by definition of XOR

代入 X=a^b 和 Y=b:

((a^b)&~b)|(~(a^b)&b) == (a^b)^b

那么,剩下的就简单了:

(a^b)^b == a^(b^b) == a^0 == a