排他的論理和

アドバンスドプログラミングのTOPページに戻る


排他的論理和

ここでは、真を1で、偽を0で表すことにする。

排他的論理和 xor (exclusive or)とは、

1 xor 1 = 0 
1 xor 0 = 1
0 xor 1 = 1
0 xor 0 = 0

と定められるものである。
すなわち a, b のどちらか一方だけが 1 であるときにだけ a xor b = 1  となる。

排他的論理和には、次のような、いくつかの面白い性質がある。 a, b, ..., c は0か1かのどちらかとする。

(1)    a xor b xor ... xor c のように複数個のものの xor をとった場合、a, b, ..., c の中で 1 であるものの個数が奇数個ならば結果は 1、偶数個ならば結果は0となる。

(2)    a xor a = 0

(3)    a xor b = 0 ならば a = b

ビットごとの排他的論理和

演算子 ^ はビットごとの排他的論理和を与える。これは、数値を2進数で表しておいて、繰り上がりなしで足し算をした結果と同じである。

1100 ^ 1010 = 0110  (2進数)
12    ^  10   =  6      (10進数)

当然、これも排他的論和と同様に、次の性質がある。

(1)    a ^ b ^ ... ^ c の各ビットの値は、対応するビットが1であるものが、 a, b, ..., c の中に奇数個あるときに限り、1である。

(2)    a ^ a = 0

(3)    a ^ b = 0 ならば a = b


ビットごとの排他的論理輪を用いた,簡単な暗号

ビットごとの排他的論理輪 ^ を用いて,簡単な暗号を作ることができる.

まず,暗号化のための鍵である整数値 k を決める.

暗号化する前のデータ(整数値)を A とするき,A と k とのビットごとの排他的論理輪をとり,B = A ^ k を暗号化したデータとする.
B から元のデータ A を復元する(復号化)するには,B と k とのビットごとの排他的論理輪をとり, B ^ k とすれば,次のように,A が得られる.

 B ^ k = (A ^ k) ^ k = A ^ (k ^ k) = A ^ 0 = A

main()
{
int a, b, c, k;

a = 77777;
k = 12345;
b = a ^ k;
printf("%d¥n", b);
c = b ^ k;
printf("%d¥n", c);
}