var a:int = 12345; var b:int = 67890; trace(a, b); // 出力: 12345 67890 a = a ^ b; b = a ^ b; a = a ^ b; trace(a, b); // 出力: 67890 12345
ビットごとの排他的論理和(bitwise exclusive or)演算子^で、ふたつの変数の整数を他の変数は使わずに入替えることができます。
演算子^はふたつの計算対象(オペランド)の整数を2進数で扱い、各桁のどちらか一方のみが1のとき1、そうでないときは0にします。「ビットごと」というのは、繰り上がりや繰り下がりがなく、それぞれの桁だけで演算するということです。すると、ひと桁(1ビット)の数aとbの値は0か1で、総当たりの組合わせは4とおり、a^bの計算結果は次表001のようになります。
表001■ビットごとの排他的論理和演算子^の計算結果a\b | 0 | 1 |
0 | 0 | 1 |
1 | 1 | 0 |
では、改めて前掲のスクリプト001について、ビットひとつの計算結果を4とおり確かめてみましょう。次表002に掲げたように、変数aとbの値がいずれも入替わります。2進数に換えた整数のすべての桁(ビット)でこの計算が行われますので、結果としてふたつの変数の整数が入替わることになるのです。
表002■ビットごとの4通りの計算結果var a:int = | 0 | 0 | 1 | 1 |
var b:int = | 0 | 1 | 0 | 1 |
a = a ^ b = | 0 | 1 | 1 | 0 |
b = a ^ b = | 0 | 0 | 1 | 1 |
a = a ^ b = | 0 | 1 | 0 | 1 |