Являются ли «сложение» и «побитовое или» одним и тем же в этом случае?

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

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

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

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

Спасибо!


person Albus Dumbledore    schedule 07.09.2011    source источник
comment
В качестве третьего варианта вы также можете использовать исключающее ИЛИ, то есть оператор ^.   -  person fredoverflow    schedule 07.09.2011
comment
Но учтите, что если вы хотите объединить такие числа в одно, лучше использовать |.   -  person starblue    schedule 07.09.2011


Ответы (6)


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

num1 + num2 == num1 | num2

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

person Andreas Grapentin    schedule 07.09.2011
comment
не будет ли более точным сказать, что сложение — это побитовое XOR плюс перенос? - person Evan Teran; 07.09.2011
comment
Один быстрее другого? - person Kyle Delaney; 26.03.2018
comment
@KyleDelaney ответ на этот вопрос не помещается в поле для комментариев :) - person Andreas Grapentin; 26.03.2018

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

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

person glglgl    schedule 07.09.2011

No:

num3 + num3 => 0x000001FE

num3 | num3 => 0x000000FF

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

person Lindydancer    schedule 07.09.2011
comment
Извините, я забыл неявно исключить этот случай. - person Albus Dumbledore; 07.09.2011
comment
И поскольку вы снова забудете об этом в следующий раз (все так делают), всегда используйте | для логических выражений. - В отличие от того, когда вы действительно считаете, т.е. в случаях, когда, скажем, десятичное представление тоже имеет смысл. - person not-a-user; 10.12.2013

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

person Anomie    schedule 07.09.2011

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

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

person PlasmaHH    schedule 07.09.2011

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

person John Humphreys    schedule 07.09.2011