Равенство термина и кодовой линии - PullRequest
0 голосов
/ 10 января 2019

Может кто-нибудь объяснить мне, пожалуйста, шаг за шагом, как это равенство может выполняться?

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

Каков наилучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Простая разработка xor и упрощение:

((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.

0 голосов
/ 10 января 2019

(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

0 голосов
/ 10 января 2019

программа для проверки:

#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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...