Bitsel operatör XOR ('^') nasıl çalışır?

5 Cevap php

Ben aşağıdaki kodun çıktısını görünce biraz kafam karıştı:

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

Ve ben nasıl operatör ^? Netlikte açıklamalar duyacağız burada mı çalışıyor acaba!

5 Cevap

Bu swapping a value using xor gibi görünüyor. Ben php (normalde ints veya bir şey için kullanabilirsiniz) olarak dizeleri hakkında emin değilim düşündüm. Yapabilirsiniz xor bir doğruluk tablosu için look here.

Hakkında ilginç xor bu yönlüdür olmasıdır: A xor B xor B == A ki ... and veya or ile çalışmıyor. Bundan dolayı bu iki değer değiş tokuş etmek için örnek olarak kullanılabilir:

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

şu anlama gelir:

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

^ "Özel veya" bit operatörüdür. Bu "ya da" İngilizce olarak okur. Her iki bit farklılık sadece ve sadece sonucu 1:

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

Biraz böylece örnek basitleştirilmesi (ve Sözde kodu kullanarak):

$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

Yapmış tüm PHP kendi tamsayı eşdeğerleri gibi dizesini "a" ve "b" tedavi olduğunu.

Th ^ operatörü işlenenlerinden her bit çalışır, yani bir bit operatörüdür.

Eşit konum eğer işlenenler de iki karşılık gelen bit eşit ise her bit 1 olduğu bir değer döndürür, ve 0.

Örneğin:

   100110110
 ^ 010001100   
 = 110111010

Kullveığınız bu örnekte ^ karakterleri tamsayılar için döküm vardır. Bu yüzden

"a" ^ "b"

: aynı gibidir

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

Bir istisna dışında. İlk örnek sonucunda geri dize döküm. Örneğin:

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

çünkü:

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

ve

chr(87) == "W"

^ Operatör her değişkenin bit değerleri üzerinde bir XOR gerçekleştirir. XOR şunları yapar:

a   = 1100
b   = 1010
xor = 0110

x XOR işleminin sonucudur. Bitler eşit ise bunlar sonuç 1 farklı ise sonuç 0'dır.

Sizin örnekte ^ = XOR ve atama yapar ve iki değişkenleri $ x ve $ y arasındaki etrafında bit takas.

Devamı burada http://en.wikipedia.org/wiki/Xor_swap_algorithm