「ビットから始めるプログラミング」では紹介しませんでしたが、論理演算には排他的論理和というものがあります。
排他的論理和の演算子を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が復号できることが分かります。