初心者向けのJava講座です。一緒にJavaを勉強しませんか?
はじめてのJava入門初心者向けのJava講座 |
シフト演算子
ここから少し難しくなってきます。
シフト演算子とは数値データを2進数であらわし
左または右に指定数だけ移動する演算子です。
演算記号には 「<<」、「>>」、「>>>」などを使います。 例を挙げながら説明します。
<<演算子 (左シフト演算子)
<<演算子は左シフト演算子とよばれるもので
数値を2進数であらわした時の値を右辺で指定したケタ数分だけ左にずらし、
はみ出したケタ数だけ右端から0をうめるという意味になります
まず、普段から使っている数字0123456789は10進数です。しかしここではその10進数を
まず、2進数にしてやらなければいけないのです。
2進数というのは010101という0と1だけで表された数字です。
byte b = 17;
b << 2;このシフト演算子を考えて見ましょう。
まず、byte型の b の数値17を2進数に変換します。
byte型のbの数値17を2進数に変換しましょう
まず、10進数の17を2進数に変換していきます。
変換の仕方は17を2で割っていけばいいのです。
17を2で割ると8になり余りが1になります。次に8を2で割れば4になり余りは0になります。
4を2で割れば2になり余りが0になり2を2で割れば1になり余りが0です。
つまり2進数とは2で割った時の余りを表しているのです。
計算式より赤で表された部分を上から時計回りに表します。
つまり17を2進数で表すと
10001になります。
Sponsored link
では、話に戻しますが、今回はbyte型の 17でした。
byte型のサイズは8bitでした。
したがってbyte型の 17を2進数で表すと
00010001
になるのです。 これでbyte型の 17を2進数で表すことができました。では、ここからが本題になります。
問題はbyte b = 17;
b << 2;でした。
b << 2; これは左シフト演算子と呼ばれるもので先ほど2進数で表記した値を右辺の値分だけ左に移動し移動した分だけ右端に0が入ります。
つまり b << 2; とは左に2移動し右端に0が2つ入ります。
byte型の 17 を 左シフトさせます。
byte型の 17 を 2進数で表すと
00010001
でした。これを左に2だけ移動し右端に0が2つ入ります。すると以下のようになるのがわかります。
0001000100
つまり、青い太字で書かれた分だけ左に移動し黒の太字で書かれた分だけ右端に0が入りました。しかし問題はbyte型で8bitでした。つまり8bitを超える分は切り捨てられます。
したがって青い太字の部分は切り捨てられ最終的には
01000100
になります。これがbyte b = 17;
b << 2;
した値になります。
10進数に戻します。
先ほどの結果を10進数に戻します。
byte 17; を左に2シフトした結果は以下のようになりました。
01000100
ではこれを元の10進数に戻したいと思います戻し方は以下のような計算でできます。
0 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
つまり1が入っている部分だけ計算をして加算してやればいいのです。
2X2=4
2X2X2X2X2X2=64
byte b = 17;
b << 2;
の値は
68になります。
Sponsored link
年間580円からの格安ドメイン取得サービス─ムームードメイン─
>>演算子 (右シフト演算子)
>>演算子は右シフト演算子とよばれるもので
数値を2進数であらわした時の値を右辺で指定したケタ数分だけ右にずらし、
はみ出したケタ数だけ左端から正の数なら0を入れ負の数なら1を入れるという意味になります
byte b = 17;
b >> 2; まず、先ほどbyte 17;を2進数で表すと以下のようになりました。00010001
byte型の 17を右にシフトさせます
00010001
右辺の数だけ右にシフトさせますので、ここでは b >> 2 より2だけ右に移動させます。
このようになります。0000010001
になり右に移動したのではみ出した値青い太字で書かれた部分が切り捨てられます。したがって以下のような結果になります。
00000100
10進数に戻します
先ほどの結果を10進数に戻します。
byte型の 17; を右に2シフトした結果は以下のようになりました。
00000100
ではこれを元の10進数に戻したいと思います戻し方は以下のような計算でできます。
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
のようになり1の部分だけ計算して加算します。ここでの場合は1が入っている部分は3bitだけですね
したがって
シフト演算子の簡単な求め方
実は今までややこしい求め方をしてきましたが実は簡単に求めることができます。
上記計算でも求めることができるのです ではプログラムを作成して確認したいと思います。サンプルプログラム(Sample19.java)
class Sample19{ public static void main(String args[]){
byte b = 17; System.out.println(" b << 2 :" + (b << 2)); System.out.println(" b >> 2 :" + (b >> 2)); } }
プログラムをコピーする場合すべて選択をクリックしてください。
Sponsored link
コンパイル・実行してみます。
先ほど計算した結果が出力されたのがわかります。