次のコードの出力を見ると、少し混乱しています。
$x = "a";
$y = "b";
$x ^= $y;
$y ^= $x;
$x ^= $y;
echo $x; //Got b
echo $y; //Got a
オペレーターはここでどのように機能し^
ますか?
次のコードの出力を見ると、少し混乱しています。
$x = "a";
$y = "b";
$x ^= $y;
$y ^= $x;
$x ^= $y;
echo $x; //Got b
echo $y; //Got a
オペレーターはここでどのように機能し^
ますか?
^ は「排他的論理和」ビット演算子です。英語では「either or」と読みます。両方のビットが異なる場合にのみ、結果は 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" を整数の同等物として扱うことだけです。
これは、 XOR を使用して値を交換するように見えます。PHPの文字列についてはよくわかりませんが(通常はintなどに使用します)。XOR の真理値表については、こちらを参照してください。
興味深いのXOR
は、それが可逆であることです: A XOR B XOR B == A ... AND
orでは機能しませんOR
。このため、例のように使用して2つの値を交換できます。
$x ^= $y;
$y ^= $x;
$x ^= $y;
意味:
$x = $x ^ $y
$y = $y ^ ($x ^ $y) // = $x
$x = ($x ^ $y) ^ ($y ^ ($x ^ $y)) // = $y
この例では、^ 文字を使用している場合、それらは整数にキャストされます。そう
"a" ^ "b"
以下と同じです:
ord("a") ^ ord ("b")
1 つの例外を除いて。最初の例では、結果が文字列にキャストされました。例えば:
"a" ^ "6" == "W"
なぜなら:
ord("a") ^ ord("6") == 87
と
chr(87) == "W"
この演算子^
はビット単位の演算子です。つまり、オペランドのすべてのビットを操作します。
1
オペランドの 2 つの対応するビットが等しくない場合、およびそれらが等しい場合は、各ビットの値を返します0
。
例えば:
100110110 ^ 010001100 = 110111010
^ 演算子は、各変数のビット値に対して XOR を実行します。XOR は次のことを行います。
a = 1100
b = 1010
xor = 0110
x は XOR 演算の結果です。ビットが等しい場合、結果は 0 であり、それらが異なる場合、結果は 1 です。
あなたの例では、^= は XOR と代入を実行し、2 つの変数 $x と $y の間でビットを交換します。
XOR
or 排他的な or は、ロジックと回路に基づいています。これは、たとえば、A ^= B
A が 0111 で B が 0101 の場合、対応する各ビットで 1 または 0 のいずれかであり、両方ではないことを示します。したがって
A = 0111
B = 0101
_____
^= 0010
これをよりよく理解するために、キャリーオーバーがないことを除いて、バイナリ数学のルールが適用されます。したがって、バイナリ演算では 1 + 0 = 1、0 + 0 = 0、0 + 1 = 1 および 1 + 1 = 0 (1 はバイナリ演算で次に重要な位置に繰り越されますが、XOR ルールはこれをバイパスします) )。
注: したがって、XOR ルールにより、上記の例で A ^= B の結果を取得し、それに A を追加して B を取得したり、B を追加して A を取得したりできます (上記のスワップ機能を参照)。