Javaのビット演算とは?概要や使い方をサンプルコードを用いてご紹介します
- システム
エンジニア - ビット演算とはどのようなことなのでしょうか。
- プロジェクト
マネージャー - 数値を2進数表記にして、ビットごとに計算することを言います。ビットとは2進数の各桁のことです。
ビット演算とは?
ビット演算とは、数値を2進数表記にして、ビットごとに計算することを言います。ビットとは2進数の各桁のことです。
ビット演算にはいくつかの種類があり、演算子と呼ばれる記号でビット演算の種類を表します。例えば、論理積のビット演算は「&」という記号を使用し、論理和のビット演算は「|」という記号を使用します。
ビット演算の種類
ビット演算には次のような種類があります。
1.論理積(演算子の記号は「&」)
2.論理和(演算子の記号は「|」)
3.排他的論理和(演算子の記号は「^」)
4.反転(演算子の記号は「~」)
5.左シフト(演算子の記号は「<<」)
6.符号あり右シフト(演算子の記号は「>>」)
7.符号なし右シフト(演算子の記号は「>>>」)
ビット演算の方法
ビット演算を行うためには、数値を2進数置き換えて考える必要があります。2進数に置き換えた後、ビットごとに計算します。
以降にビット演算の方法について説明します。
論理積(演算子の記号は「&」)
ビット演算の論理積は、2つの数値の同じ位置にあるビットを比較し、どちらも「1」である場合だけ計算結果が「1」になります。それ以外の場合は「0」になります。
例えば、2つの数値「10」と「12」の論理積の演算は次の通りです。
1
2
3
4
5
6
|
1010 (=10)
& 1100 (=12)
----------------------
1000 (=8)
|
両方が「1」である桁だけ「1」となり、それ以外は「0」になります。演算結果は「8」となります。
Javaコードのサンプル例
論理積のJavaコードサンプル例です。
1
2
3
4
5
6
7
8
9
|
class JSample1{
public static void main(String[] args){
int i;
i = 85 & 15;
System.out.println( i );
}
}
|
Javaコードで出力された結果は、「5」となります。
論理和(演算子の記号は「|」)
ビット演算の論理和は、2つの数値の同じ位置にあるビットを比較し、どちらかが「1」または両方が「1」の場合に計算結果が「1」になります。どちらも「0」の場合は計算結果が「0」になります。
例えば、2つの数値「10」と「12」の論理和の演算は次の通りです。
1
2
3
4
5
6
|
1010 (=10)
| 1100 (=12)
----------------------
1110 (=14)
|
どちらかが「1」または、両方が「1」である桁が「1」となり、両方とも「0」である桁が「0」になります。演算結果は「14」となります。
Javaコードのサンプル例
論理和のJavaコードサンプル例です。
1
2
3
4
5
6
7
8
9
|
class JSample2{
public static void main(String[] args){
int i;
i = 85 | 15;
System.out.println( i );
}
}
|
Javaコードで出力された結果は、「95」となります。
排他的論理和(演算子の記号は「^」)
ビット演算の排他論理和は、2つの数値の同じ位置にあるビットを比較し、値が異なる場合に計算結果が「1」、値が同じ場合に計算結果が「0」になります。
例えば、2つの数値「10」と「12」の排他論理和の演算は次の通りです。
1
2
3
4
5
6
|
1010 (=10)
^ 1100 (=12)
----------------------
0110 (=6)
|
値が異なる桁が「1」となり、値が同じ桁が「0」になります。演算結果は「6」となります。
Javaコードのサンプル例
排他的論理和のJavaコードサンプル例です。
1
2
3
4
5
6
7
8
9
|
class JSample3{
public static void main(String[] args){
int i;
i = 85 ^ 15;
System.out.println( i );
}
}
|
Javaコードで出力された結果は、「90」となります。
反転(演算子の記号は「~」)
ビット演算の反転は、数値の各ビットが「0」の場合は「1」に、「1」の場合は「0」に変換します。
例えば、数値「10」の反転の演算は次の通りです。
1
2
3
4
5
|
~ 1010 (=10)
----------------------
0101 (=5)
|
各ビットにおいて「0」と「1」を入れ替えます。演算結果は「5」となります。
Javaコードのサンプル例
反転のJavaコードサンプル例です。
1
2
3
4
5
6
7
8
9
|
class JSample4{
public static void main(String[] args){
int i;
i = ~85;
System.out.println( i );
}
}
|
Javaコードで出力された結果は、「-86」となります。
左シフト(演算子の記号は「<<」)
ビット演算の左シフトは、数値をビット単位で左にずらします。
例えば、数値「10」を左シフトで1ビットずらす演算は次の通りです。
1
2
3
4
5
|
0000 1010 << 1
--------------------------------
0001 0100 (=20)
|
数値「10」を左シフトで2ビットずらした場合は次のようになります。
1
2
3
4
5
|
0000 1010 << 2
--------------------------------
0010 1000 (=40)
|
数値「10」を左シフトで5ビットずらした場合は次のようになります。
1
2
3
4
5
|
0000 1010 << 5
--------------------------------
0100 0000 (=64)
|
このように左シフトしたときに右入ってくる数値は「0」です。左から出て行った数値は切り捨てられます。また、左シフトで1ビットずらすと値が2倍になるという法則性があります。
Javaコードのサンプル例
左シフトのJavaコードサンプル例です。
1
2
3
4
5
6
7
8
9
|
class JSample5{
public static void main(String[] args){
int i;
i = 21 << 2;
System.out.println( i );
}
}
|
Javaコードで出力された結果は、「84」となります。
符号あり右シフト(演算子の記号は「>>」)
ビット演算の符号あり右シフトは、数値をビット単位で右にずらします。
例えば、数値「10」を右シフトで1ビットずらす演算は次の通りです。
1
2
3
4
5
|
0000 1010 >> 1
--------------------------------
0000 0101 (=5)
|
数値「10」を右シフトで2ビットずらした場合は次のようになります。
1
2
3
4
5
|
0000 1010 >> 2
--------------------------------
0000 0010 (=2)
|
数値「10」を右シフトで5ビットずらした場合は次のようになります。
1
2
3
4
5
|
0000 1010 >> 5
--------------------------------
0000 0000 (=0)
|
数値「-10」を右シフトで5ビットずらした場合は次のようになります。「-10」は2進数で表すと「1111 0110」です。
1
2
3
4
5
|
1111 0110 >> 5
--------------------------------
1111 1111 (=-1)
|
このように右シフトしたときに左入ってくる数値は最上位ビットが「0」だった場合は「0」が入り、最上ビットが「1」だった場合は「1」が入ります。右から出て行った数値は切り捨てられます。
また、符号あり右シフトでは、1ビットずらすと値が1/2になるという法則性があります。
Javaコードのサンプル例
符号あり右シフトのJavaコードサンプル例です。
1
2
3
4
5
6
7
8
9
|
class JSample6{
public static void main(String[] args){
int i;
i = 21 >> 2;
System.out.println( i );
}
}
|
Javaコードで出力された結果は、「5」となります。
次に最上位ビットが「1」(マイナス値)だった場合の例です。
1
2
3
4
5
6
7
8
9
|
class JSample7{
public static void main(String[] args){
int i;
i = -92 >> 2;
System.out.println( i );
}
}
|
Javaコードで出力された結果は、「-23」となります。
符号なし右シフト(演算子の記号は「>>>」)
ビット演算の符号なし右シフトは、数値をビット単位で右にずらします。
例えば、数値「10」を右シフトで1ビットずらす演算は次の通りです。
1
2
3
4
5
|
0000 1010 >> 1
--------------------------------
0000 0101 (=5)
|
数値「10」を右シフトで2ビットずらした場合は次のようになります。
1
2
3
4
5
|
0000 1010 >> 2
--------------------------------
0000 0010 (=2)
|
数値「10」を右シフトで5ビットずらした場合は次のようになります。
1
2
3
4
5
|
0000 1010 >> 5
--------------------------------
0000 0000 (=0)
|
数値「-10」を右シフトで5ビットずらした場合は次のようになります。「-10」は2進数で表すと「1111 0110」です。
1
2
3
4
5
|
1111 0110 >> 5
--------------------------------
0000 0111 (=7)
|
このように右シフトしたときに左入ってくる数値は必ず「0」です。右から出て行った数値は切り捨てられます。
Javaコードのサンプル例
符号なし右シフトのJavaコードサンプル例です。
1
2
3
4
5
6
7
8
9
|
class JSample8{
public static void main(String[] args){
int i;
i = 21 >>> 2;
System.out.println( i );
}
}
|
Javaコードで出力された結果は、「5」となります。
次に最上位ビットが「1」(マイナス値)だった場合の例です。
1
2
3
4
5
6
7
8
9
|
class JSample9{
public static void main(String[] args){
int i;
i = -92 >>> 2;
System.out.println( i );
}
}
|
Javaコードで出力された結果は、「1073741801」となります。
- システム
エンジニア - ビット演算の種類や方法などについて理解できました。
- プロジェクト
マネージャー - この機会に基本となるビット演算について学んでおきましょう。
Javaでのビット演算とは?【まとめ】
今回は、ビット演算についての概要とJavaコードのサンプル例を説明してきました。
ビット演算にはいくつかの種類があり目的に沿ったものを使用しましょう。例えば、ネットワークのIPアドレスを、サブネットマスクを用いてネットワーク部とホスト部に分ける場合などは、論理積、論理和といったビット演算を使用します。
ビット演算は基本となりますので、是非使いこなせるようにしておきましょう。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
Java新着案件New Job
-
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅) -
販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅) -
生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅) -
社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅) -
金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅) -
大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)