2016.04.03

ビットシフト(bit shift)

はじめに

ビットシフト(bit shift)とは、2進数を表現するビット(0と1の2つの値)の桁を左右のどちらかに指定回数だけずらすことです。右にビットの並びをずらす右シフトと、左にずらす左シフトがあります。

①右シフト

すべてのビットを右にずらします。演算子は、">>"です。

下の例は、byte型(8bit)の78を右にシフトしている様子を表したものです。

byte型変数に対してシフト処理を行うと、int型(32bit)に自動的にキャストされます。

	00101110(2進数) = 78(10進数)
	00101110 >> 1 = 00000000 00000000 00000000 00010111 = 32bitの39(10進数)

条件によって、1回の右シフトには2で割るのと同じ計算になります。

2で割ったときの余りは切り捨てです。

ここでの条件は、計算する値が整数型で、正の整数であることです。

偶数の右シフト

	00000110(2進数) = 6(10進数)
	00000110 >> 1 = 00000000 00000000 00000000 00000011 = 32bitの3(10進数)

奇数の右シフト

	00000101(2進数) = 5(10進数)
	00000101 >> 1 = 00000000 00000000 00000000 00000010 = 32bitの2(10進数)

②左シフト

すべてのビットを左にずらします。演算子は、"<<"です。

下の例は、bytet型(8bit)の78を左にシフトしている様子を表したものです。

byte型変数に対してシフト処理を行うと、int型(32bit)に自動的にキャストされます。

	00101110(2進数) = 78(10進数)
	00101110 << 1 = 00000000 00000000 00000000 01011100 = 32bitの156(10進数)

条件によって、1回の左シフトには2を掛けるのと同じ計算になります。

ここでの条件は、計算する値が整数型で、正の整数であることです。

Javaソースコード - 左右のビットシフト例

左シフト、右シフトを使ったJavaソースコードの例です。

BitShift.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
public class BitShift {
	public static void main( String[] args ) {
		// 変数aに代入
		byte a = 78;

		// 右シフト1回
		System.out.println( a >> 1 );

		// 右シフト2回
		System.out.println( a >> 2 );

		// 左シフト1回
		System.out.println( a << 1 );

		// 左シフト2回
		System.out.println( a << 2 );
	}
}

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis BitShift.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac BitShift.java

実行

C:\talavax\javasample>java BitShift

出力結果

39
19
156
312

Javabyte型の範囲は-128~127です。

出力結果の156と312はこの範囲の外です。これは、byte型変数aのビットシフトを行う際にビット数の多いint型に自動的にキャストして計算された結果です。

ここからは、このソースコードを上から順番に解説していきます。

001
public class BitShift {

クラス名を、BitShiftとしています。

002
	public static void main( String[] args ) {

このmainメソッドからプログラムを実行します。

003
004
		// 変数aに代入
		byte a = 78;

byte型変数aに値78を代入しています。

006
007
		// 右シフト1回
		System.out.println( a >> 1 );

変数aの値を右に1回シフトした値をprintlnメソッドコンソール出力しています。

009
010
		// 右シフト2回
		System.out.println( a >> 2 );

変数aの値を右に2回シフトした値をprintlnメソッドコンソール出力しています。

012
013
		// 左シフト1回
		System.out.println( a << 1 );

変数aの値を左に1回シフトした値をprintlnメソッドコンソール出力しています。

015
016
		// 左シフト2回
		System.out.println( a << 2 );

変数aの値を左に2回シフトした値をprintlnメソッドコンソール出力しています。

Javaソースコード - byteの左シフトを8回行う

BitShift1.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
public class BitShift1 {
	public static void main( String[] args ) {
		// 変数aに1を代入
		byte a = 0b00000001;

		// 左シフトを8回行う
		for ( int i = 0; i <= 8; i ++ ) {
			// 結果の出力
			System.out.println( "シフト回数:" + i + " " + a );

			// 左シフト
			a <<= 1;
		}
	}
}

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis BitShift1.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac BitShift1.java

実行

C:\talavax\javasample>java BitShift1

出力結果

シフト回数:0 1
シフト回数:1 2
シフト回数:2 4
シフト回数:3 8
シフト回数:4 16
シフト回数:5 32
シフト回数:6 64
シフト回数:7 -128
シフト回数:8 0

ここからは、このソースコードを上から順番に解説していきます。

001
public class BitShift1 {

クラス名を、BitShift1としています。

002
	public static void main( String[] args ) {

このmainメソッドからプログラムを実行します。

003
004
		// 変数aに1を代入
		byte a = 0b00000001;

byte型変数aに1を代入しています。先頭に'0b'を付けると2進数で記述することができます。

006
007
		// 左シフトを8回行う
		for ( int i = 0; i <= 8; i ++ ) {

for文変数iが0~8まで変化するループを作成しています。

008
009
			// 結果の出力
			System.out.println( "シフト回数:" + i + " " + a );

シフト回数と変数aの値をコンソール出力しています。

011
012
			// 左シフト
			a <<= 1;

変数aの値を左に1回シフトしています。

以上です。

関連コンテンツ

プログラミングで使う変数って何?

2020.03.23

基本的な計算である足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)を行うプログラム作成。

2020.03.23

「0」と「1」の2つの数字で表される2進数(バイナリ)。一般に使われている10進数に変換するには。

2016.02.16

24ビット(フルカラー)、32ビットカラーからR(赤)、G(緑)、B(青)、A(アルファ値)を抽出する方法を説明しています。

2020.03.23

日本で使われてきた伝統文様「和柄」について解説しています。

2022.07.27

画像フォーマット形式・色・大きさ・傾きなどの変更、特定の図形(文字・記号など)を見つけたり、取り出したりする画像処理について詳しく解説。

2015.11.29

プログラミング、ITに関する用語をまとめています。

2022.10.17

変数やクラスに格納されている値をコンソール出力する方法は?

2020.03.23

プログラムの最初に実行されるメソッドは?

2022.12.13

Javaのプログラムを書いてみませんか?プログラムの書き方をくわしく説明しています。

2020.03.23

「Javaソースコード」から実行可能な「オブジェクトコード」に変換する方法をくわしく説明しています。

2020.03.23

Javaのプログラムを作ってみませんか?プログラミングに必要なものの用意から実行までを説明しています。

2020.03.23

Javaの学習に役立つソースコードを多数紹介しています。是非、ご覧ください。

2022.09.10

Swingパッケージを使ってグラフィック表示を行う方法を解説しています。

2020.03.23

繰り返し処理を使ったJavaのソースコードサンプルを紹介しています。

2020.03.23

配列を使うJavaソースコードを多数紹介しています。

2021.05.18

数学に関係するJavaのメソッドやソースコードなどを紹介しています。

2022.10.25

三角形、台形、円などいろいろな図形の面積を計算するプログラムを紹介しています。詳しくは、記事をご覧ください。

2021.05.18

StringクラスとStringBuilderクラスを利用したプログラミングの仕方を紹介しています。

2016.12.16

Javaを使った簡単な応用プログラム(生年月日から年齢を計算プログラムなど)を紹介しています。

2022.07.07

数値を2進数で表したときの各桁の「0」と「1」に対して演算を行えます。4種類の演算、AND(論理積)、OR(論理和)、XOR(排他的論理和)、NOT(否定)を詳しく説明しています。

2016.03.26

データの型を変換する方法を詳しく解説しています。例)int型 → long型

2015.11.01

割り算で割り切れずに残った端数を剰余(余り)といいます。この剰余の計算をJavaのソースコードを使って解説しています。

2020.03.23

自然数と整数って何が違う?

2020.03.23

コンピュータで扱う情報の量を表す単位って何?メモリ、HDD(ハードディスク)、SSDなどデータを格納する機器の仕様に書いている記号GB,TBとは?

2020.10.12

プログラミング言語とは?種類や特徴について説明しています。

2022.08.03

Javaプログラムの構成について解説しています。詳しくは、こちらをご覧ください。

2020.03.23

for文で変数名iがよく使われる理由について説明しています。興味のある方は是非。

2022.08.29

処理を繰り返すために使用するfor文について解説しています。

2020.03.23

繰り返し処理の作り方を解説しています。

2016.03.02

「ゆるゆるプログラム」のコンテンツを紹介しています。興味のある方はこの記事をご覧ください。

2020.03.23

変数に値を代入する演算子について詳しく解説しています。サンプルのソースコード付きです。

2020.03.23

int型の変数の掛け算による2倍('*2')、左ビットシフト1回('<<1')による2倍の2種類の計算速度を比較しました。

2018.06.24

広告