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

この記事を読む前に下記の記事を読んだ方が、ビット演算子の理解が進むと思います。

 

syopuro.hatenablog.com

 

こんにちは、前回に引き続きビット演算子編ということで、初めて行きます。

前回ビット演算子にも色んなことを詰め込みすぎて、
頭がこんがらがった人もいると思います。

自分も書いててう~んと思ったので、短く分かりやすい記事のほうが、
まとめやすいし読みやすく一石二鳥なので、そんなことを意識して書いていきたいです。
今回のテーマは、ビット演算子の中でも論理和と呼ばれるものですね。

整数ビット演算子[ | ]

これだとあるのか。分かり辛いですね。笑

演算子は、論理和を演算する事ができる演算子です。

そのため前回と同様図で見ていきましょう。

f:id:hiromunomymail:20200301074522p:plain

図を見てもらえば分かると思いますが、演算後の結果に0が演算されることが、AとB両方のオペランドが0の時だけになりました。

論理和という言葉からイメージしてもらうと良いかと思いますが、AとBの片方にでも1がある時演算結果は、1になるのが特徴です。

まあ、1+1だけは1と0のみで表すコンピュータの世界には2がないので、演算結果は2と覚えず、1と覚えておきましょう。

同じように1+0=1、0+1=1、0+0=0のように考えられるように、|演算子は、論理和であるから、左のオペランドと右のオペランドを足し算したとき
に、1以上の数になれば演算結果は1になると考えておきましょう。

それでは、以上のことを踏まえスクリプトを書いていきましょう。

1と0だけで行う|演算
public class Main {

	public static void main(String[] args) {
		int a=1|0;
		System.out.println(a);
		
	}
}

問題なく1が表示されたと思います。

2進数|演算
public class Main {

	public static void main(String[] args) {
		int a=0b0001|0b1111;
		System.out.println(a);
		System.out.println(Integer.toBinaryString(a));
		
	}
}

10進数の15と2進数の1111が表示されたと思います。

今日のスクリプトの解説

aには1111が格納されました。そのままPrintすると10進数として表示されるので、今回は,Integer.toBinaryString()メソッドにaを引数として渡します。それにより、String型に変換されてかつ2進数化したしたものが、戻り値として帰ってきます。これにより、画面には2進数として表されるaが表示されます。


ここで、Integer.toBinaryString()についても説明を入れておきます。

Integer.toBinaryString()

Integer.toBinaryString()はjavaの標準パッケージのjava.langのIntegerクラスが持つメソッドです。java.langは3級の範囲ですが、
意外と知らないと思います。覚えて置きましょう。

int型を引数として、引数を2進数にして、String型の戻り値として、返す特徴があります。

ちなみに2進数変換は、toBinaryString()で変換できますが、

  • 10進数の変換はtoUnsignedString()
  • 16進数の変換がtoHexString()
  • 8進数の変換がtoOctalString()

で行えます。

10進数の変換を行う意味があまり感じられませんが、進数変換の記事を作る機会があればまとめたいです。

次は、10進数での|演算子をやりましょう。書いてから思いましたが、2進数もまとめて一つのスクリプトにすれば良かったと今更思っています。

10進数の|演算
public class Main {

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

31
1111+10000=11111

が結果として、出力されたと思います。これ2進数の表示しなかったらわけわからないですよね。

2進数に直すと分かると思います。しっかり|演算されていますね。

次が最後の16進数です。
public class Main {

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

3b
11010+101011=111011

が実行結果として、出たと思います。16進数だけ見るとほんとに論理演算されているのか気になりますが、2進数を見ると納得です。16進数だけみても3bと出るあたり規則性が、ありそうですがキリがないので、置いておきましょう。

まとめ

  • とりあえず、困ったら2進数で考えてみる。
  • 基本的に足し算2進数の世界には、2がないので、1で表す。10進数16進数になると足し算であることを実感しずらい。