本文へスキップ
BecomeCoder

Java文法コース · 第3章 演算子 ― 値を計算し、比較し、組み合わせる · レッスン13

ビット演算 ― 2進数レベルの演算(軽く紹介)

ブラウザで完結

導入

普段のプログラミングで頻繁には使いませんが、フラグの組み合わせや高速な計算のために ビット演算 が使われることがあります。「こういうものがある」程度に、軽く触れておきましょう。

説明

整数は内部では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用)と & |(ビット演算子・整数用)は見た目が似ていますが別物です。混同しないようにしましょう。

やってみよう

下のエディタで ab の値を変えて、& | ^ の結果を確かめましょう。<<>> のシフト数を2、3と増やして、値が何倍・何分の1になるか観察してみてください。

演習

int n = 8; を左に2ビットシフト(n << 2)した結果を n に入れ直して表示してください(結果は 32)。

ヒント1を見る

n = n << 2; と書きます(2ビット左シフト=4倍)。

ヒント2を見る

System.out.println(n); で表示します。

実際に動かしてみよう

下のエディタにJavaを書いて「実行」を押すと、学習用シミュレータが System.out.println の出力を表示します(本物のJVMではなく、教材の範囲を再現した軽量エンジンです)。クラス・継承・コレクションなども動きます。Scanner で入力を読む例は「標準入力」欄に値を入れてください。本文の例を書き換えて動かしてみましょう(Stream・ラムダ・スレッド・ファイル入出力など一部の機能は対象外です)。

Java — ブラウザ内で実行(学習用シミュレータ)

Javaの教材サブセットを動かす学習用シミュレータを読み込みます(本物のJVMではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。