Javaコラム Javaエンジニアのためのお役立ちコラム

Javaのビット演算とは?概要や使い方をサンプルコードを用いてご紹介します

2021年08月17日
SE
ビット演算とはどのようなことなのでしょうか。
PM
数値を2進数表記にして、ビットごとに計算することを言います。ビットとは2進数の各桁のことです。

ビット演算とは?


ビット演算とは、数値を2進数表記にして、ビットごとに計算することを言います。ビットとは2進数の各桁のことです。

ビット演算にはいくつかの種類があり、演算子と呼ばれる記号でビット演算の種類を表します。例えば、論理積のビット演算は「&」という記号を使用し、論理和のビット演算は「|」という記号を使用します。

ビット演算の種類


ビット演算には次のような種類があります。

1.論理積(演算子の記号は「&」)
2.論理和(演算子の記号は「|」)
3.排他的論理和(演算子の記号は「^」)
4.反転(演算子の記号は「~」)
5.左シフト(演算子の記号は「<<」)
6.符号あり右シフト(演算子の記号は「>>」)
7.符号なし右シフト(演算子の記号は「>>>」)

ビット演算の方法


ビット演算を行うためには、数値を2進数置き換えて考える必要があります。2進数に置き換えた後、ビットごとに計算します。

以降にビット演算の方法について説明します。

論理積(演算子の記号は「&」)

ビット演算の論理積は、2つの数値の同じ位置にあるビットを比較し、どちらも「1」である場合だけ計算結果が「1」になります。それ以外の場合は「0」になります。

例えば、2つの数値「10」と「12」の論理積の演算は次の通りです。

両方が「1」である桁だけ「1」となり、それ以外は「0」になります。演算結果は「8」となります。

Javaコードのサンプル例

論理積のJavaコードサンプル例です。

Javaコードで出力された結果は、「5」となります。

論理和(演算子の記号は「|」)

ビット演算の論理和は、2つの数値の同じ位置にあるビットを比較し、どちらかが「1」または両方が「1」の場合に計算結果が「1」になります。どちらも「0」の場合は計算結果が「0」になります。

例えば、2つの数値「10」と「12」の論理和の演算は次の通りです。

どちらかが「1」または、両方が「1」である桁が「1」となり、両方とも「0」である桁が「0」になります。演算結果は「14」となります。

Javaコードのサンプル例

論理和のJavaコードサンプル例です。

Javaコードで出力された結果は、「95」となります。

排他的論理和(演算子の記号は「^」)

ビット演算の排他論理和は、2つの数値の同じ位置にあるビットを比較し、値が異なる場合に計算結果が「1」、値が同じ場合に計算結果が「0」になります。

例えば、2つの数値「10」と「12」の排他論理和の演算は次の通りです。

値が異なる桁が「1」となり、値が同じ桁が「0」になります。演算結果は「6」となります。

Javaコードのサンプル例

排他的論理和のJavaコードサンプル例です。

Javaコードで出力された結果は、「90」となります。

反転(演算子の記号は「~」)

ビット演算の反転は、数値の各ビットが「0」の場合は「1」に、「1」の場合は「0」に変換します。

例えば、数値「10」の反転の演算は次の通りです。

各ビットにおいて「0」と「1」を入れ替えます。演算結果は「5」となります。

Javaコードのサンプル例

反転のJavaコードサンプル例です。

Javaコードで出力された結果は、「-86」となります。

左シフト(演算子の記号は「<<」)

ビット演算の左シフトは、数値をビット単位で左にずらします。

例えば、数値「10」を左シフトで1ビットずらす演算は次の通りです。

数値「10」を左シフトで2ビットずらした場合は次のようになります。

数値「10」を左シフトで5ビットずらした場合は次のようになります。

このように左シフトしたときに右入ってくる数値は「0」です。左から出て行った数値は切り捨てられます。また、左シフトで1ビットずらすと値が2倍になるという法則性があります。

Javaコードのサンプル例

左シフトのJavaコードサンプル例です。

Javaコードで出力された結果は、「84」となります。

符号あり右シフト(演算子の記号は「>>」)

ビット演算の符号あり右シフトは、数値をビット単位で右にずらします。

例えば、数値「10」を右シフトで1ビットずらす演算は次の通りです。

数値「10」を右シフトで2ビットずらした場合は次のようになります。

数値「10」を右シフトで5ビットずらした場合は次のようになります。

数値「-10」を右シフトで5ビットずらした場合は次のようになります。「-10」は2進数で表すと「1111 0110」です。

このように右シフトしたときに左入ってくる数値は最上位ビットが「0」だった場合は「0」が入り、最上ビットが「1」だった場合は「1」が入ります。右から出て行った数値は切り捨てられます。

また、符号あり右シフトでは、1ビットずらすと値が1/2になるという法則性があります。

Javaコードのサンプル例

符号あり右シフトのJavaコードサンプル例です。

Javaコードで出力された結果は、「5」となります。

次に最上位ビットが「1」(マイナス値)だった場合の例です。

Javaコードで出力された結果は、「-23」となります。

符号なし右シフト(演算子の記号は「>>>」)

ビット演算の符号なし右シフトは、数値をビット単位で右にずらします。

例えば、数値「10」を右シフトで1ビットずらす演算は次の通りです。

数値「10」を右シフトで2ビットずらした場合は次のようになります。

数値「10」を右シフトで5ビットずらした場合は次のようになります。

数値「-10」を右シフトで5ビットずらした場合は次のようになります。「-10」は2進数で表すと「1111 0110」です。

このように右シフトしたときに左入ってくる数値は必ず「0」です。右から出て行った数値は切り捨てられます。

Javaコードのサンプル例

符号なし右シフトのJavaコードサンプル例です。

Javaコードで出力された結果は、「5」となります。

次に最上位ビットが「1」(マイナス値)だった場合の例です。

Javaコードで出力された結果は、「1073741801」となります。

SE
ビット演算の種類や方法などについて理解できました。
PM
この機会に基本となるビット演算について学んでおきましょう。

Javaでのビット演算とは?【まとめ】


今回は、ビット演算についての概要とJavaコードのサンプル例を説明してきました。

ビット演算にはいくつかの種類があり目的に沿ったものを使用しましょう。例えば、ネットワークのIPアドレスを、サブネットマスクを用いてネットワーク部とホスト部に分ける場合などは、論理積、論理和といったビット演算を使用します。

ビット演算は基本となりますので、是非使いこなせるようにしておきましょう。


Javaでのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

recommended

Categories

Tags