operadores desplazamiento bitwise php bitwise-operators

php - desplazamiento - operadores de bits en c



¿Cómo funciona el operador bit a bit XOR(''^'')? (6)

Estoy un poco confundido cuando veo la salida del siguiente código:

$x = "a"; $y = "b"; $x ^= $y; $y ^= $x; $x ^= $y; echo $x; //Got b echo $y; //Got a

¿Cómo funciona el operador aquí?


El operador ^ es un operador bit a bit, lo que significa que opera en cada bit de sus operandos.

Devuelve un valor en el que cada bit es 1 si los dos bits correspondientes en los operandos son desiguales, y 0 si son iguales.

Por ejemplo:

100110110 ^ 010001100 = 110111010


El operador ^ realiza un XOR en los valores de bit de cada variable. XOR hace lo siguiente:

a = 1100 b = 1010 xor = 0110

x es el resultado de la operación XOR. Si los bits son iguales, el resultado es 0 si son diferentes, el resultado es 1.

En su ejemplo, ^ = realiza XOR y asignación, y usted intercambia los bits entre las dos variables $ x y $ y.

Lea más aquí http://en.wikipedia.org/wiki/Xor_swap_algorithm


En este ejemplo, cuando utiliza caracteres ^, se convierten en enteros. Asi que

"a" ^ "b"

es lo mismo que:

ord("a") ^ ord ("b")

con una excepcion. En el primer ejemplo, el resultado se convirtió de nuevo en una cadena. Por ejemplo:

"a" ^ "6" == "W"

porque:

ord("a") ^ ord("6") == 87

y

chr(87) == "W"


Esto parece como intercambiar un valor usando XOR . Aunque no estoy seguro de las cadenas en PHP (normalmente lo usas para ints o algo así). Para una tabla de verdad de XOR puedes mirar aquí .

Lo interesante de XOR es que es reversible: A XOR B XOR B == A ... que no funciona con AND u OR . Debido a este hecho, se puede usar como en su ejemplo para intercambiar dos valores:

$x ^= $y; $y ^= $x; $x ^= $y;

medio:

$x = $x ^ $y $y = $y ^ ($x ^ $y) // = $x $x = ($x ^ $y) ^ ($y ^ ($x ^ $y)) // = $y


^ es el "exclusivo o" operador bit a bit. Se lee en inglés como "o bien". El resultado es 1 si y solo si ambos bits difieren:

1 ^ 0 = 1 1 ^ 1 = 0 0 ^ 0 = 0

Simplificando un poco el ejemplo (y usando Pseudo código):

$x = 0011 //binary $y = 0010 $x = $x xor $y //Result: x = 0001 //x = 0001 //y = 0010 $y = $y xor $x //Result: y = 0011 //x = 0001 //y = 0011 $x = $x xor $y //Result: x = 0010

Todo lo que PHP ha hecho es tratar las cadenas "a" y "b" como sus equivalentes enteros.


XOR o el exclusivo o está basado en lógica y circuitos. Indica que, por ejemplo, A ^= B donde A es 0111 y B es 0101 puede ser 1 o 0 en cada bit correspondiente pero no ambos. Por lo tanto

A = 0111 B = 0101 _____ ^= 0010

Para entender mejor esto, se aplican las reglas de las matemáticas binarias, excepto que no hay prórrogas. Así que en matemáticas binarias 1 + 0 = 1, 0 + 0 = 0, 0 + 1 = 1 y 1 + 1 = 0 (donde un 1 se traslada a la siguiente posición más significativa en matemáticas binarias, pero las reglas de XOR omiten esto ).

Nota: que las reglas XOR, por lo tanto, le permiten tomar el resultado de A ^ = B en el ejemplo anterior y agregar A para obtener B o agregar B para obtener A (haciendo referencia a la capacidad de intercambio mencionada anteriormente).