文系プログラマーのプログラミング備忘録

Java、競プロ、数学などについて書いてます

XOR [yukicoder No.581]

yukicoder.me


A と B の排他的論理和が C であることがわかっている。A と C が与えられるので B を求めよ、という問題です。

import java.util.*;

class Main {
	static Scanner sc = new Scanner(System.in);
	public static void main(String[] args) {
		
		long a = sc.nextLong();
		long b = sc.nextLong();
		System.out.println(a ^ b);
		
	}
}


解説には「A と C の排他的論理和をとれば B になる」とあります。表を見ると、なるほど確かに A と C の排他的論理和をとると B になっていますが、もう一押し、何かわかりやすい解説が欲しいところです。


それで解説サイトを巡っていたら、以下のような式変形を見つけました。


・A^B = C
・A^A^B = A^C
  →排他的論理和の計算に順番は関係ないらしいので、左辺をB^A^Aにする
・B^A^A = A^C
  →ここで「排他的論理和は2回繰り返すと元に戻る」という性質を利用する
  →よって (B^A)^A は元に戻って B である
・B = A^C


これならスッキリと理解できそうですが、式変形の2番目、何の前提もなしに両辺と A の排他的論理和をとってしまってますけど、これって大丈夫なんでしょうか。一通り調べましたが、あまりに基本的すぎることなのか、どこにも書いてありません。排他的論理和は競プロで頻出の考え方ですし、一度書籍など購入してイチから勉強したほうがいいのかもしれないですね。