排他的論理和

ビットから始めるプログラミング」では紹介しませんでしたが、論理演算には排他的論理和というものがあります。

排他的論理和の演算子をxor(exclusive-or)とし、論理値true(真)とfalse(偽)に対してxorを次のように定義します。

true  xor  true  → false
true  xor  false     → true
false  xor  true     → true
false  xor  false   → false

2つの論理値が同じならその演算xorの結果はfalseで、異なるなら演算xorの結果はtrueとなります。

面白いことに、演算結果の論理値と演算前の論理値の1つとで演算xorを行うと、結果はもう1つの論理値になります。このことは演算式を使って次のように言い換えることができます。

変数A、Bが論理値をもち、演算xorの結果が変数Rに収められ、「A  xor  B → R」とします。このとき、「A  xor  R → B」、「B  xor  R → A」となります。上記の演算xorの定義を使って確かめてみてください。

ここで、trueとfalseに対してそれぞれ1と0を対応させ、ビットに対する排他的論理和を考えると、上の式は次のように書き直すことができます。

1  xor  1   → 0
1  xor  0       → 1
0  xor  1           →     1
0  xor  0       →     0

当然ですが、この場合も、変数A、Bが論理値(1,0)をもち、演算xorの結果が変数Rに収められ、「A  xor  B → R」とすると、「A  xor  R → B」、「B  xor  R → A」が成り立ちます。

次にビット列に対する排他的論理和を考えます。

変数A、Bがそれぞれ長さが同じビット列をもつとします。A、Bの対応するビットのそれぞれに演算xorを適用したビット列(変数Rに収める)を、ビット列A、Bの演算xorの結果とします。

これらの変数A、B、Rに対しても、「A  xor  B → R」とすると、「A  xor  R → B」、「B  xor  R → A」が成り立ちます。

ビット列に対する排他的論理和は暗号に用いることができます。

Aを平文、Bを暗号鍵とし、演算xorを使って暗号文Rを作成し、逆に暗号文(R)と暗号鍵(B)から平文Aが復号できることが分かります。