月曜日, 2月 18, 2008

排他的論理和(exclusive OR) その2

排他的論理和の話をもう少し。
今回は主にアセンブラで使われる手法です。

A=Bの時、

A XOR B = 0

となりました。

つまり、
A XOR A = 0

です。

あるレジスタAXを0でクリアしたい場合、素直に記述すると

MOV AX, 0

となりますが、排他的論理和を使うと
XOR AX, AX

のように書くことができます。

何が嬉しいのかというと、まず"0"というリテラルを記憶しておく容量を節約できます。
あと、CPUによっては後者のほうが実行速度が速くなるかもしれません。
アセンブラの仕様にもよるので一概には言えないかもしれませんが、まあそんな感じです。

排他的論理和のもうひとつ重要な特徴が
同じ値で2回演算すると元の値に戻るということです。
つまり、
(A XOR B) XOR B = A

となります。

この特徴を利用すると、値の交換を行う際に一時的な値の退避場所が不要になります。

ある2つの値xとyを交換するとき、一般的な方法は次のようになります。

1.tempにyの値を代入

2.yにxの値を代入

3.xにtempの値を代入


この場合、xとy以外に一時的に値を退避しておくための記憶場所が必要になります。

しかし排他的論理和を使うと次の手順で値の交換をすることができます。

1.xにx XOR yの演算結果を代入

2.yにx XOR yの演算結果を代入

3.xにx XOR yの演算結果を代入


つまり、次のような記述で値の交換が可能です。

XOR AX, BX
XOR BX, AX
XOR AX, BX


はじめて見ると不思議かも知れませんが、
じっくりを追っかけていけば理解できると思います。

0 件のコメント: