ビット演算子「^演算子」とは

前回の記事はこちらから、
syopuro.hatenablog.com

こんにちは、今日のテーマは、^ビットです。

排他論理和ということで、前回の論理和の逆を想像しますが、そういう訳ではありません。
(実はそうです。後で詳しく説明するので、とりあえずこのイメージでいてください。)

どちらかというと論理積の逆というのが、簡単な覚え方です。

演算子とは

この演算子は、一言でいうなれば論理積の逆です。論理積が、オペランドの両方が同じ値のときのみに演算結果として、
1演算したのに対して、今回の^演算子は、その逆で両方とも1の場合は0を返す演算子です。

それではいつも通り図で見ていきましょう。
f:id:hiromunomymail:20200302090405p:plain
どうでしたか、オペランドの両方が同値をとるときは0を演算するのが分かったと思います。


それでは、いつも通り、2進数と10進数、16進数で同じように結果が、出ているのかを見ていきましょう。

二進数の^演算子
public class Main {

	public static void main(String[] args) {
		int a=0b1010;
		int b=0b1100;
		int c=a^b;
		System.out.println(Integer.toBinaryString(a)+"+"+Integer.toBinaryString(b)+"="+Integer.toBinaryString(c));
	}
}


1010+1100=110

と表示されたのではないでしょうか。0110じゃないのと思いますが、先頭に0があろうがなかろうが、変わらないということで0が消されるんですよね。

10進数
public class Main {

	public static void main(String[] args) {
		int a=16;
		int b=26;
		int c=a^b;
		System.out.println(Integer.toBinaryString(a)+"+"+Integer.toBinaryString(b)+"="+Integer.toBinaryString(c));
                System.out.println(c);
	}
}

10000+11010=1010
10

あれ、10進数表示したときの、数字がb-aの答えと一緒になってますね。ちなみにaの方が大きい場合には、足し算されます。不思議です。

調子に乗っていろいろ試したんですが、数が大きくなるとこの法則は使えません。時間があればしっかり調べて記事を訂正したいですが、今回はこの謎については

おいておきます。どちらにしろ、1度2進数に直すのが得策です。

次は、16進数です。

16進数の^演算子

public class Main {

	public static void main(String[] args) {
		int a=0x15;
		int b=0x12;
		int c=a^b;
		System.out.println(Integer.toBinaryString(a)+"+"+Integer.toBinaryString(b)+"="+Integer.toBinaryString(c));
		System.out.println(Integer.toHexString(c));
	}
}

10101+10010=111
7

こちらは10進数とは違いaが大きい場合には足し算される。

逆にbが大きい場合は引き算される。

10進数同様数が大きいと、そうはいかない。ここで間違ったことも言えないので、変換の際は一度2進数に直すといいですよ。

まとめ

  • ^演算子は排他論理和という演算を使う。
  • 基本的には、一度2進数に変換するのが良い。