Comment fonctionne l'opérateur bitwise XOR ('^')?

je suis un peu confus quand je vois la sortie du code suivant:

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

Comment l'opérateur ^ travailler ici?

23
demandé sur Peter Mortensen 2010-04-20 16:12:54

6 réponses

cela ressemble à échanger une valeur en utilisant XOR . Bien que je ne sois pas sûr des chaînes de caractères en PHP (normalement vous l'utilisez pour les ints ou quelque chose comme ça). Pour une table de vérité de XOR vous pouvez regarder ici .

la chose intéressante à propos de XOR est qu'il est réversible: a XOR B XOR b == a... cela ne fonctionne pas avec AND ou OR . De ce fait, il peut être utilisé comme dans votre exemple pour échanger deux valeurs:

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

signifie:

$x = $x ^ $y
$y = $y ^ ($x ^ $y)                // = $x
$x = ($x ^ $y) ^ ($y ^ ($x ^ $y))  // = $y
10
répondu tanascius 2015-12-28 16:01:24

^ est l'opérateur" exclusif ou " bitwise. Il lit en anglais par "ou". Le résultat est 1 si et seulement si les deux bits diffèrent:

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

simplifiant un peu l'exemple (et en utilisant un Pseudo code):

$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

tout ce que PHP a fait est de traiter la chaîne" a "et" b " comme leurs équivalents entiers.

19
répondu Yacoby 2010-04-20 12:21:37

dans cet exemple, quand vous utilisez ^ caractères, ils sont castés à des entiers. So

"a" ^ "b"

est le même que:

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

à une exception près. Dans le premier exemple, le résultat a été renvoyé à une chaîne. Par exemple:

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

à cause de:

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

et

chr(87) == "W"
7
répondu Denis Bazhenov 2015-12-28 15:57:19

Th ^ opérateur est un opérateur bitwise, ce qui signifie qu'il opère sur chaque bit de ses opérandes.

renvoie une valeur dans laquelle chaque bit est 1 si les deux bits correspondants dans les opérandes sont inégaux, et 0 s'ils sont égaux.

par exemple:

   100110110
 ^ 010001100   
 = 110111010
6
répondu SLaks 2010-04-20 12:18:42

l'opérateur ^ exécute un XOR sur les valeurs de bits de chaque variable. XOR fait ce qui suit:

a   = 1100
b   = 1010
xor = 0110

x est le résultat de l'opération XOR. Si les bits sont égaux le résultat est 0 s'ils sont différents le résultat est 1.

dans votre exemple, le ^= exécute XOR et assignment, et vous échangez les bits entre les deux variables $x et $Y.

lire la suite http://en.wikipedia.org/wiki/Xor_swap_algorithm

1
répondu Justin 2010-04-20 12:36:32

XOR ou l'exclusif ou est basé sur la logique et les circuits. Il indique que, par exemple, A ^= B où A est 0111 et B est 0101 peut être soit 1 ou 0 à chaque bit correspondant mais pas les deux. Par conséquent

A = 0111
B = 0101
    _____
^=  0010 

Pour mieux comprendre ce que les règles de mathématiques binaires s'appliquent, sauf qu'il n'y a pas retenues. Donc en mathématiques binaires 1 + 0 = 1, 0 + 0 = 0, 0 + 1 = 1 et 1 + 1 = 0 (où 1 est reporté à la prochaine plus grande place dans les maths binaires, mais les règles XOR contournent cela).

Note: que les règles XOR, par conséquent, vous permettent de prendre le résultat D'un ^= B dans l'exemple ci-dessus et ajouter Un à elle pour obtenir B ou ajouter B pour obtenez un (en faisant référence à la capacité de swap mentionnée ci-dessus.

0
répondu ALJ 2014-06-07 03:36:30