ビット演算子「^演算子」とは
前回の記事はこちらから、
syopuro.hatenablog.com
こんにちは、今日のテーマは、^ビットです。
排他論理和ということで、前回の論理和の逆を想像しますが、そういう訳ではありません。
(実はそうです。後で詳しく説明するので、とりあえずこのイメージでいてください。)
どちらかというと論理積の逆というのが、簡単な覚え方です。
^演算子とは
この演算子は、一言でいうなれば論理積の逆です。論理積が、オペランドの両方が同じ値のときのみに演算結果として、
1演算したのに対して、今回の^演算子は、その逆で両方とも1の場合は0を返す演算子です。
それではいつも通り図で見ていきましょう。
どうでしたか、オペランドの両方が同値をとるときは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進数に直すといいですよ。