Представьте, что у вас есть два двоичных числа: a
и b
. И скажем, что эти числа никогда не имеют 1 в одном и том же бите в одно и то же время, то есть, если a
имеет 1 в каком-то бите, b
всегда имеет 0 в соответствующем бите. И в другом направлении, если b
имеет 1 в каком-то бите, то a
всегда имеет 0 в этом бите. Например
a = 00100011
b = 11000100
Это будет пример a
и b
, удовлетворяющих вышеуказанному условию. В этом случае легко увидеть, что a | b
будет точно таким же, как a + b
.
a | b = 11100111
a + b = 11100111
Давайте теперь возьмем два числа, которые нарушают наше условие, то есть два числа имеют хотя бы одну единицу в некотором общем бите
a = 00100111
b = 11000100
В этом случае a | b
совпадает с a + b
? Нет
a | b = 11100111
a + b = 11101011
Почему они разные? Они отличаются, потому что когда мы +
бит, который имеет 1 в обоих числах, мы производим так называемый перенос : результирующий бит равен 0, а 1 переносится в следующий бит слева: 1 + 1 = 10
. Операция |
не имеет переноса, поэтому 1 | 1
снова просто 1.
Это означает, что разница между a | b
и a + b
возникает тогда и только тогда, когда числа имеют по крайней мере один 1 в общем бите. Когда мы суммируем два числа с 1 в общих битах, эти общие биты добавляются «дважды» и производят перенос, который разрушает сходство между a | b
и a + b
.
Теперь посмотрите на a & b
. Что вычисляет a & b
? a & b
производит число, которое имеет 1 во всех битах, где и a
, и b
имеют 1. В нашем последнем примере
a = 00100111
b = 11000100
a & b = 00000100
Как вы видели выше, именно эти биты отличают a + b
от a | b
. 1 в a & b
указывает на все позиции, где произойдет перенос.
Теперь, когда мы делаем a - (a & b)
, мы эффективно удаляем (вычитаем) все "оскорбительные" биты из a
и только такие биты
a - (a & b) = 00100011
Числа a - (a & b)
и b
не имеют общих 1 битов, что означает, что если мы добавим a - (a & b)
и b
, мы не столкнемся с переносом, и, если вы подумаете об этом, мы должны закончить с тем же результатом, как если бы мы только что сделали a | b
a - (a & b) + b = 11100111