operator manipulation bitwise c++ c math bitwise-operators addition

manipulation - c++ operator



¿Son "adición" y "en modo bit" o "lo mismo en este caso? (6)

La adición y bit a bit o sería lo mismo que bit a bit o incluiría cualquier bit en cualquiera de los dos, y la adición normal haría exactamente lo mismo dada la naturaleza mutuamente exclusiva de sus bits.

Digamos que tengo cuatro números de 32 bits, definidos para que sus bits no se superpongan, es decir,

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

Donde en cada número uno podría tener algo en lugar de los FF s.

¿Estoy en lo cierto al decir que la adición y en modo de bits o siempre produciría la misma salida para este tipo de números?

¡Gracias!


Mientras no estés haciendo algo como num3 + num3 , sí.


No:

num3 + num3 => 0x000001FE num3 | num3 => 0x000000FF

Por supuesto, siempre y cuando se asegure de que solo se suman cosas en las que sabe que no tienen el mismo conjunto de bits, debe estar seguro.


Sí, ya que (visto en modo bit) 0+1 es lo mismo que 0|1 . La única diferencia es 1|1 (=1) vs. 1+1(=0b10) , es decir, crear un 0 y tener un desbordamiento, afectando los bits a la izquierda).

Así que en tu caso ambos son equivalentes. Pero debe ir al lado seguro y elegir el menos propenso a errores.


Siempre que la adición a nivel de bits agregue más de un 1 (ya sea porque las fuentes las tienen o porque el acarreo desde otro lugar también es 1), se produce un arrastre y un lugar afecta al otro. Siempre que en una adición se agregue a lo sumo 1, las cosas son igual a bit o.

Esto también se puede ver cuando miramos los circuitos sumadores (http://en.wikipedia.org/wiki/Adder_%28electronics%29), donde cuando no se produce ningún carry, todos los elementos que participan en el circuito son "o "elementos.


siempre que para dos números num1 y num2 se aplique num1 & num2 == 0 , luego sigue:

num1 + num2 == num1 | num2

La razón de esto es que esa adición es básicamente un XOR a nivel de bits, más un bit de acarreo. Pero siempre que no haya bits de acarreo ( num1 & num2 == 0 ), la adición se reduce a XOR en modo bit, que es (nuevamente debido a num1 & num2 == 0 ) en este caso lógicamente equivalente a un OR a bit a bit