[AS3] XORマジック [Edit]

スクリプト001■ビットごとの排他的論理和演算子^で変数の整数を入替える
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

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事