Являются ли "добавлением" и "поразрядными" или "одинаковыми" в этом случае?

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

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

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

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

Спасибо!

Ответы

Ответ 1

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

num1 + num2 == num1 | num2

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

Ответ 2

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

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

Ответ 3

<Не p > Нет:
num3 + num3 => 0x000001FE

num3 | num3 => 0x000000FF

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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