(a&b)^(a|b) == a^b
Так что все становится довольно просто.
Почему? Давайте рассмотрим только один бит, потому что все биты независимы. Таблица истинности для исходного выражения будет выглядеть следующим образом:
a b a&b a|b ^
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0
Это та же таблица истинности, что и у a ^ b
.
Другой способ взглянуть на нее, который также в таблице истинности видно, что для XOR мы можем поменять местами левый и правый операнд, как мы sh. И мы можем сделать это для каждого бита независимо. Итак, скажем, мы начинаем с a ^ b
, тогда мы могли бы, если бы захотели, расположить операнды таким образом, чтобы как можно больше нулей были заменены на левый операнд, а как можно больше - на правый операнд. Для 00 и 11 это ничего не меняет, но мы меняем 10 на 01. Как мы можем это сделать? Приняв a & b
в качестве левого операнда и a | b
в качестве правого операнда, а затем он вернется к исходному выражению.