Представьте, что у вас есть два двоичных числа: 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
Давайте теперь возьмем два числа, которые нарушают наши условия, то есть два числа, по крайней мере, один 1 в некоторых общих бит
a = 00100111
b = 11000100
Является a | b
же, как a + b
в этом случае? No
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
"Все двоичные числа я мог думать" - beut :) Хороший вопрос капитана. –
Почему у Oracle есть 'BITAND()', но нет 'BITOR()'? – Thanatos