導入
普段のプログラミングで頻繁には使いませんが、フラグの組み合わせや高速な計算のために ビット演算 が使われることがあります。「こういうものがある」程度に、軽く触れておきましょう。
説明
整数は内部では2進数(0と1の並び)で表現されています。ビット演算は、その2進数を桁ごとに計算します。
public class Main {
public static void main(String[] args) {
int a = 6; // 2進数では 0110
int b = 3; // 2進数では 0011
System.out.println(a & b); // 論理積(AND) → 2 (0010)
System.out.println(a | b); // 論理和(OR) → 7 (0111)
System.out.println(a ^ b); // 排他的論理和(XOR) → 5 (0101)
System.out.println(a << 1); // 左に1ビットシフト → 12(2倍になる)
System.out.println(a >> 1); // 右に1ビットシフト → 3(半分になる、切り捨て)
}
}
&(AND)… 両方のビットが1のときだけ1。|(OR)… どちらかのビットが1なら1。^(XOR)… ビットが異なるときだけ1。<<(左シフト)… ビット全体を左にずらす。1ビットずらすごとに値は2倍になります。>>(右シフト)… ビット全体を右にずらす。1ビットずらすごとに値は**半分(切り捨て)**になります。
&& ||(論理演算子・boolean用)と & |(ビット演算子・整数用)は見た目が似ていますが別物です。混同しないようにしましょう。
やってみよう
下のエディタで a と b の値を変えて、& | ^ の結果を確かめましょう。<< や >> のシフト数を2、3と増やして、値が何倍・何分の1になるか観察してみてください。
演習
int n = 8; を左に2ビットシフト(n << 2)した結果を n に入れ直して表示してください(結果は 32)。
ヒント1を見る
n = n << 2; と書きます(2ビット左シフト=4倍)。
ヒント2を見る
System.out.println(n); で表示します。