Imagine que tiene dos números binarios: a
y b
. Y digamos que estos números nunca tienen 1 en el mismo bit al mismo tiempo, es decir, si a
tiene 1 en algún bit, el b
siempre tiene 0 en el bit correspondiente. Y en otra dirección, si b
tiene 1 en algún bit, entonces a
siempre tiene 0 en ese bit. Por ejemplo
a = 00100011
b = 11000100
Esto sería un ejemplo de a
y b
que satisface la condición anteriormente. En este caso, es fácil ver que a | b
sería exactamente igual a a + b
.
a | b = 11100111
a + b = 11100111
Echemos dos números que violan nuestra condición, es decir, dos números tienen al menos un 1 en algunos poco comunes
a = 00100111
b = 11000100
Es a | b
lo mismo que a + b
en este caso? No
a | b = 11100111
a + b = 11101011
¿Por qué son diferentes? Son diferentes porque cuando +
la parte que tiene 1, tanto en número, se producen los llamados de transporte: el bit resultante es 0, 1 y se lleva a la siguiente bit a la izquierda: 1 + 1 = 10
. Operación |
no tiene transporte, por lo que es de nuevo sólo 1 | 1
1.
Esto significa que la diferencia entre a | b
y a + b
se produce cuando, y sólo cuando los números tienen al menos un 1 en el bit comunes. Cuando sumamos dos números con 1 en bits comunes, estos bits comunes se agregan "dos veces" y producen un acarreo, lo que arruina la similitud entre a | b
y a + b
.
Ahora mira a & b
. ¿Qué calcula a & b
? a & b
produce el número que tiene 1 en todos los bits donde a
y b
tienen 1.En nuestro último ejemplo
a = 00100111
b = 11000100
a & b = 00000100
Como se vio anteriormente, estos son exactamente los bits que difieren de a + b
a | b
. El 1 en a & b
indica todas las posiciones donde se producirá el acarreo.
Ahora, cuando hacemos a - (a & b)
que efectivamente eliminamos (restar) todos los bits "ofender" de a
y sólo tales bits de
a - (a & b) = 00100011
Números a - (a & b)
y b
no tienen 1 bits comunes, lo que significa que si añadimos a - (a & b)
y b
no vamos a correr en un acarreo, y, si se piensa en ello, debemos terminar con el mismo resultado que si que acabamos de hacer a | b
a - (a & b) + b = 11100111
"Todos los números binarios que podría pensar en" - Beut :) Niza capitán cuestión. –
¿Por qué Oracle tiene un 'BITAND()' pero no 'BITOR()'? – Thanatos