ここでは、真を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);
}