web-dev-qa-db-ja.com

ビット演算子XOR( '^')はどのように機能しますか?

次のコードの出力を見ると、少し混乱しています。

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

演算子はどのように^ここで働きますか?

24
Young

これは XORを使用して値を交換する のようになります。 PHP(通常はintなどに使用します)の文字列についてはわかりませんが、XORの真理値表の場合は ここを見てください

XORの興味深い点は、リバーシブルであるということです。AXOR B XOR B == A ...で動作しませんANDまたはOR。この事実のため、例のように2つの値を交換するために使用できます。

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

手段:

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

^は「排他的論理和」ビット演算子です。英語では「どちらか」と読みます。両方のビットが異なる場合に限り、結果は1になります。

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

例を少し単純化して(そして擬似コードを使用して):

$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

PHPが行ったのは、文字列「a」と「b」を同等の整数として扱うことだけです。

20
Yacoby

この例では、^文字を使用している場合、それらは整数にキャストされます。そう

"a" ^ "b"

と同じです:

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

1つの例外を除いて。最初の例では、結果が文字列にキャストバックされました。例えば:

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

のため:

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

そして

chr(87) == "W"
7
Denis Bazhenov

Th ^演算子はビット単位の演算子です。つまり、オペランドのすべてのビットを操作します。

オペランドの対応する2つのビットが等しくない場合は各ビットが1であり、等しい場合は0である値を返します。

例えば:

 100110110 
 ^ 010001100 
 = 110111010
6
SLaks

^演算子は、各変数のビット値に対してXORを実行します。XORは、次のことを実行します。

a   = 1100
b   = 1010
xor = 0110

xはXOR演算の結果です。ビットが等しい場合、結果は0になり、異なる場合、結果は1になります。

あなたの例では、^ =はXORと割り当てを実行し、2つの変数$ xと$ yの間でビットを交換します。

詳細はこちら http://en.wikipedia.org/wiki/Xor_swap_algorithm

1
Justin

XORまたは排他的論理和は論理と回路に基づいています。これは、たとえば、A ^= Bここで、Aは0111、Bは0101で、対応する各ビットで1または0のいずれかになりますが、両方にはなりません。したがって、

A = 0111
B = 0101
    _____
^=  0010 

これをよりよく理解するために、キャリーオーバーがないことを除いて、バイナリ数学のルールが適用されます。したがって、2進数学では1 + 0 = 1、0 + 0 = 0、0 + 1 = 1および1+ 1 = 0(1は2進数学で次に重要な位置に繰り越されますが、XORルールはこれをバイパスします)。

注:XORルールでは、上記の例のA ^ = Bの結果を取得し、それにAを追加してBを取得するか、Bを追加してAを取得することができます(上記のスワップ機能を参照します。

0
ALJ