次のコードの出力を見ると、少し混乱しています。
$x = "a";
$y = "b";
$x ^= $y;
$y ^= $x;
$x ^= $y;
echo $x; //Got b
echo $y; //Got a
演算子はどのように^
ここで働きますか?
これは 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
^は「排他的論理和」ビット演算子です。英語では「どちらか」と読みます。両方のビットが異なる場合に限り、結果は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」を同等の整数として扱うことだけです。
この例では、^文字を使用している場合、それらは整数にキャストされます。そう
"a" ^ "b"
と同じです:
ord("a") ^ ord ("b")
1つの例外を除いて。最初の例では、結果が文字列にキャストバックされました。例えば:
"a" ^ "6" == "W"
のため:
ord("a") ^ ord("6") == 87
そして
chr(87) == "W"
Th ^
演算子はビット単位の演算子です。つまり、オペランドのすべてのビットを操作します。
オペランドの対応する2つのビットが等しくない場合は各ビットが1
であり、等しい場合は0
である値を返します。
例えば:
100110110 ^ 010001100 = 110111010
^演算子は、各変数のビット値に対してXORを実行します。XORは、次のことを実行します。
a = 1100
b = 1010
xor = 0110
xはXOR演算の結果です。ビットが等しい場合、結果は0になり、異なる場合、結果は1になります。
あなたの例では、^ =はXORと割り当てを実行し、2つの変数$ xと$ yの間でビットを交換します。
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を取得することができます(上記のスワップ機能を参照します。