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




java operadores (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í?


Answers

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

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


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


Error de análisis: error de sintaxis, inesperado '['

Este error viene en dos variables:

Variación 1

$arr = [1, 2, 3];

Esta sintaxis de inicializador de matriz solo se introdujo en PHP 5.4; generará un error de analizador en las versiones anteriores a eso. Si es posible, actualice su instalación o use la sintaxis antigua:

$arr = array(1, 2, 3);

Véase también este ejemplo del manual.

Variación 2

$suffix = explode(',', 'foo,bar')[1];

Los resultados de la función de desreferenciación de matrices también se introdujeron en PHP 5.4. Si no es posible actualizar, necesita usar una variable (temporal):

$parts = explode(',', 'foo,bar');
$suffix = $parts[1];

Véase también este ejemplo del manual.





php bitwise-operators