Являются ли "сложение" и "побитовый" или "одинаковыми" в этом случае?
Скажем, у меня есть четыре 32-битных числа, определенных так, чтобы их биты не перекрывались, т.е.
unsigned long int num0 = 0xFF000000;
unsigned long int num1 = 0x00FF0000;
unsigned long int num2 = 0x0000FF00;
unsigned long int num3 = 0x000000FF;
Где в каждом номере можно найти что-нибудь на месте FF
s.
Правильно ли я сказал, что сложение и побитовое или всегда будет производить один и тот же вывод для такого рода чисел?
Спасибо!
6 ответов
Если для двух чисел применяется num1 и num2 num1 & num2 == 0
затем следует:
num1 + num2 == num1 | num2
Причина этого в том, что сложение - это в основном побитовый XOR плюс бит переноса. Но пока нет битов переноса (num1 & num2 == 0
) затем сложение сводится к побитовой XOR, что (опять же из-за num1 & num2 == 0
) в этом случае логически эквивалентно побитовому ИЛИ
Нет:
num3 + num3 => 0x000001FE
num3 | num3 => 0x000000FF
Конечно, до тех пор, пока вы убедитесь, что вы складываете все вместе, если знаете, что они не имеют одинаковые биты, вы должны быть в безопасности.
Да как (видно побито) 0+1
такой же как 0|1
, Единственная разница 1|1 (=1)
против 1+1(=0b10)
, т. е. создать 0 и иметь переполнение, влияющее на биты слева).
Так что в вашем случае оба эквивалентны. Но вы должны перейти на безопасную сторону и выбрать менее подверженный ошибкам.
Всякий раз, когда побитовое сложение добавляет более одного 1 (либо потому, что они есть у источников, либо перенос из другого места равен 1), то создается перенос, и одно место влияет на другое. Пока в добавлении добавляется не более одного 1, все так же, как поразрядно или.
Это также можно увидеть, когда мы смотрим на схемы сумматора (http://en.wikipedia.org/wiki/Adder_%28electronics%29), где, когда перенос не производится, все элементы, участвующие в схеме, являются "или "элементы.
Сложение и побитовое или будет таким же, как побитовое, или будет включать в себя любые биты, и обычное сложение будет делать то же самое, учитывая взаимоисключающий характер ваших бит.