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).