php - operadores - ¿Cómo funciona el operador bit a bit XOR('^')?




operadores de bits java (4)

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


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.





bitwise-operators