2010-04-20 13 views
22

estoy un poco confundido cuando veo la salida del siguiente código:¿Cómo funciona el operador bit a bit XOR ('^')?

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

¿Cómo funciona el operador ^ trabajo aquí?

+3

respondidas en http://stackoverflow.com/questions/249423/how-does-xor-variable-swapping-work –

+0

¿Estás preguntando cómo funciona el operador o cómo funciona el canje? – SLaks

+0

. it.thanks @ Sebastián P, tengo – Young

Respuesta

10

Esto se parece a swapping a value using XOR. Aunque no estoy seguro de las cadenas en PHP (normalmente lo usas para enteros o algo así). Para una tabla de verdad de XOR, puede look here.

Lo interesante de XOR es que es reversible: A XOR B XOR B == A ... que no funciona con AND o OR. Debido a este hecho, que puede ser utilizado como en el ejemplo para intercambiar dos valores:

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

significa:

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

PHP está tipeado dinámicamente y odia cadenas: las convertirá a int o double cada vez que se presente una oportunidad. –

+0

@ Michael: Gracias por señalar esto - yo no lo sabía, y acaba de asumir que algo así sucede ^^ – tanascius

6

Th ^ operador es un operador de bits, lo que significa que funciona con todos los bits 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 
+0

En el código de ejemplo para la pregunta que los operandos son cadenas * *. ¿Qué sucede realmente? Por ejemplo, ¿se utilizan los valores ASCII? ¿Qué pasa si las cadenas son más largas que una? –

6

En este ejemplo, cuando se está utilizando^personajes, que están fundidas a enteros. Así

"a"^"b" 

es lo mismo que:

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

con una excepción. En el primer ejemplo, el resultado se devolvió a una cadena. Por ejemplo:

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

debido a:

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

y

chr(87) == "W" 
18

^es el operador "exclusiva o" bit a bit. Se lee en inglés como "cualquiera o". El resultado es 1 si y sólo si los dos bits son diferentes:

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

Simplificando un poco el ejemplo de modo (y utilizando el código Pseudo):

$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 la cadena "una "y" b "como sus equivalentes enteros.

1

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 el ejemplo, el^= realiza XOR y asignación, y se intercambian los bits alrededor entre las dos variables x $ y $ y.

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

0

XOR o exclusivo o se basa en la 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 esto mejor, se aplican las reglas de matemática binaria, excepto que no hay traspasos. Entonces en matemática binaria 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ática binaria, pero las reglas XOR omiten esto)

Nota: Que las reglas XOR, por lo tanto, le permiten tomar el resultado de una ^ = B en el ejemplo anterior y añadir una a él para obtener B o añadir B a ella a conseguir A (referencia la capacidad de intercambio mencionado anteriormente.