25

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

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

オペレーターはここでどのように機能し^ますか?

4

6 に答える 6

21

^ は「排他的論理和」ビット演算子です。英語では「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" を整数の同等物として扱うことだけです。

于 2010-04-20T12:21:37.267 に答える
12

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

興味深いのXORは、それが可逆であることです: A XOR B XOR B == A ... ANDorでは機能しませんOR。このため、例のように使用して2つの値を交換できます。

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

意味:

$x = $x ^ $y
$y = $y ^ ($x ^ $y)                // = $x
$x = ($x ^ $y) ^ ($y ^ ($x ^ $y))  // = $y
于 2010-04-20T12:17:21.863 に答える
7

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

"a" ^ "b"

以下と同じです:

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

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

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

なぜなら:

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

chr(87) == "W"
于 2010-04-20T12:20:49.380 に答える
6

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

1オペランドの 2 つの対応するビットが等しくない場合、およびそれらが等しい場合は、各ビットの値を返します0

例えば:

   100110110
 ^ 010001100   
= 110111010
于 2010-04-20T12:18:42.973 に答える
1

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

a   = 1100
b   = 1010
xor = 0110

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

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

ここで詳細を読むhttp://en.wikipedia.org/wiki/Xor_swap_algorithm

于 2010-04-20T12:30:43.190 に答える
0

XORor 排他的な or は、ロジックと回路に基づいています。これは、たとえば、A ^= BA が 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 を取得したりできます (上記のスワップ機能を参照)。

于 2014-06-07T03:10:21.607 に答える