PHASE2 LOG

主にIT関連・ゲームのログ

Javaのお勉強~シフト演算~

      2016/04/13

今回はシフト演算についてお勉強します。

シフト演算とは

 

2進数は桁を左右にずらすことで乗算や除算をすることができます。

これをシフト演算といいます。

 

シフト演算には符号を考慮しない論理シフトと、符号を考慮した算術シフトが存在します。

 

シフト演算子

 

 

Javaでのシフト演算子を見てみましょう。

 

1.左シフト演算子 <<

 

2進数00100000(10進数で32)を左に2ビット、シフトすると以下のようになります。

0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0

左にシフトすることで赤字部分のあふれた0は捨てられます。

最下位は左に2つずれたため、右側の空いた部分に0が補填されます。(青字の部分)

 

00100000が左に2ビットシフトされた結果は「100000000」で10進数では128となります。

nビット左シフトで2nとなるので32×4の結果と同じですね。

 

また、シフトするビット数を指定するには「a << 2」のように記述することで

2ビット左シフトするという処理になります。

 

 

2.算術右シフト演算子 >>

2進数11100000(10進数で-32)を右に2ビット、算術シフトすると以下のようになります。

1 1 1 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0

最下位は右に2つずれたため、あふれた0は捨てられます。(青字の部分)

算術シフトでは符号ビット(シフト前の一番左の部分)はシフト後もそのままです。

また、空いたビットは符号ビットと同じ数字が補填されます。

 

11100000が左に2ビットシフトされた結果は「11111000」で10進数では-8となります。

nビット右シフトで1/2nとなるので-32×1/4の結果と同じですね。

また、シフトするビット数を指定するには「a >> 2」のように記述することで

2ビット算術右シフトするという処理になります。

 

3.論理右シフト演算子 >>>

2進数00100000(10進数で32)を右に2ビット、論理シフトすると以下のようになります。

0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0

最下位は右に2つずれたため、あふれた0は捨てられます。(青字の部分)

論理シフトでは右にずれたことで空いた赤字部分には0が補填されます。

 

00100000が右に2ビット論理シフトされた結果は「00001000」で10進数では8となります。

nビット右シフトで1/2nとなるので32×1/4の結果と同じですね。

また、シフトするビット数を指定するには「a >>> 2」のように記述することで

2ビット論理右シフトするという処理になります。

 

それでは実際の例を見てみましょう。

public class ShiftTest {
	public static void main(String[] args){
		byte test1 = 32;	//2進数で00100000
		byte test2 =  -32;  //2進数で11100000
		
		//左シフト演算 00100000→100000000
		System.out.println("32を左に2ビットシフト:" + (test1 << 2)); //算術右シフト演算 00100000→00001000 System.out.println("-32を右に2ビット算術シフト:" + (test2 >> 2));
		
		//論理右シフト演算 00100000→00001000
		System.out.println("32を右に2ビット論理シフト:" + (test1 >>> 2));		
	}
}

 

 

上記の1~3の3つ解説に合わせて作ってみましたので

解説は省略します。

このソースの実行結果は以下となります。

32を左に2ビットシフト:128

-32を右に2ビット算術シフト:-8

32を右に2ビット論理シフト:8

 

本気で基本情報に取り組まないとヤバッ!な気がしてきました(;・∀・)

 

人気ブログランキング

 -