Являются ли «сложение» и «побитовый» или «одинаковыми» в этом случае? - PullRequest
17 голосов
/ 07 сентября 2011

Скажем, у меня есть четыре 32-битных числа, определенных так, чтобы их биты не перекрывались, т.е.

unsigned long int num0 = 0xFF000000;
unsigned long int num1 = 0x00FF0000;
unsigned long int num2 = 0x0000FF00;
unsigned long int num3 = 0x000000FF;

Где в каждом номере можно найти что-нибудь вместо FF s.

Прав ли я, говоря, что сложение и поразрядно или всегда будет выдавать один и тот же вывод для такого рода чисел?

Спасибо!

Ответы [ 6 ]

31 голосов
/ 07 сентября 2011

до тех пор, пока для двух чисел num1 и num2 применяется num1 & num2 == 0, затем следует:

num1 + num2 == num1 | num2

причина этого в том, что сложение - это в основном битовое значение XOR, плюс бит переноса. Но до тех пор, пока нет битов переноса (num1 & num2 == 0), сложение сводится к битовой XOR, которая (опять же из-за num1 & num2 == 0) в этом случае логически эквивалентна побитовой ИЛИ

3 голосов
/ 07 сентября 2011
нет

Нет

num3 + num3 => 0x000001FE

num3 | num3 => 0x000000FF

Конечно, до тех пор, пока вы гарантируете, что добавляете вещи только тогда, когда знаете, что у них не установлены одинаковые биты, вы должны быть в безопасности.

3 голосов
/ 07 сентября 2011

Да, поскольку (видно по битам) 0+1 совпадает с 0|1.Единственная разница - 1|1 (=1) против 1+1(=0b10), т.е. создайте 0 и переполнение, влияющее на биты слева).

Так что в вашем случае оба эквивалентныНо вы должны перейти на безопасную сторону и выбрать менее подверженный ошибкам.

1 голос
/ 07 сентября 2011

Всякий раз, когда при добавлении по битам добавляется более одного 1 (либо потому, что они есть у источников, либо перенос из другого места равен 1), то создается перенос, и одно место влияет на другое.Пока в добавлении добавляется не более одного 1, все так же, как поразрядно или.

Это также можно увидеть, когда мы смотрим на схемы сумматора (http://en.wikipedia.org/wiki/Adder_%28electronics%29),, где при отсутствии переноса все элементы, участвующие в цепи, являются элементами "или".

1 голос
/ 07 сентября 2011

Пока вы не делаете что-то вроде num3 + num3, да.

0 голосов
/ 07 сентября 2011

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

...