初心者向けのJava講座です。一緒にJavaを勉強しませんか?
はじめてのJava入門初心者向けのJava講座 |
>>>演算子
この演算子も右シフト演算子と同じですが、正負にかかわらず左端に0を埋めます
つまり
>>演算子数値が正のときは右辺だけ右にシフトし左端に0を埋める
数値が負のときは右辺だけ右にシフトし左端に1を埋める
数値が正負にかかわらず右辺だけ右にシフトし左端に0を埋める
この違いを理解しておく必要があります。数値が正のときは値は同じになりますが、負のときは変わります
では、早速見ていきましょう
>>>演算子(正の場合)
int x = 20; x >>> 2
上の例で考えていきます。まず x の値を2進数にします。
x >>> 2 の求め方(まずは、int x = 20;を2進数にします)
これを2で割っていくと以下のようになります。
つまり10進数の20を2進数表記で表すと以下のようになります。10100
つまりint x = 20; は以下のようになります。0000 0000 0000 0000 0000 0000 0001 0100
これを右に2移動して左に2埋めます。0000 0000 0000 0000 0000 0000 0000 0101 00
つまり、右に2シフト移動して青字の部分が埋められ、黒字の太字の部分が切り捨てられました。したがって
0000 0000 0000 0000 0000 0000 0000 0101 になり、それを10進数に戻します。0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
2X2 = 4
1
したがって
int x = 20;x >>> 2; の値は 5になります。
Sponsored link
>>>演算子(負の場合)
int y = -20; y >> 2; y >>> 2;
上の例で考えていきます。まず y の値を2進数にします。
y>> 2 の求め方
まずは、正の場合のint型 20 の2進数表記は
上記 int x = 20; より
0000 0000 0000 0000 0000 0000 0001 0100
でした。しかし負の場合は正の2進数を反転して1加えなければいけないのです。
つまり int y = -20;は以下のようになります。まずはすべて反転しました
1111 1111 1111 1111 1111 1111 1110 1011それに1を加えます。
1111 1111 1111 1111 1111 1111 1110 1100になりこれが int y = -20; の2進数です。
まず、>>演算子の負 の求め方は数値が負のときは右辺だけ右にシフトし左端に1を埋める
でした。つまりこのようになります。1111 1111 1111 1111 1111 1111 1111 1011 00
つまり黒い太字の部分が切り捨てられ青の部分が埋められました。したがってこのようになります。1111 1111 1111 1111 1111 1111 1111 1011
これを10進数表記に直します。まず、一番のポイントは2進数で一番先頭の数字が1の場合は10進数の負の数字になります。
負の10進数の変換の仕方はまた1と0を反転し1を足します。まずは反転すると以下のようになります。
0000 0000 0000 0000 0000 0000 0000 0100それに1加えると
0000 0000 0000 0000 0000 0000 0000 0101これを10進数に直すと
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
2X2 = 4
1
したがって y >> 2; の値は -5になります。
Sponsored link
y>>> 2 の求め方
まず、2進数の求め方は上記を参照してください!
int y = -20; の2進数表記は以下のようになります。
1111 1111 1111 1111 1111 1111 1110 1100ここからが>>演算子と>>>演算子の異なるところです。
>>演算子が数値が負のときは右辺だけ右にシフトし左端に1を埋めるのに対し
>>>演算子は数値が負のときは右辺だけ右にシフトし左端に0を埋めるのです。
1111 1111 1111 1111 1111 1111 1110 1100
を>>>演算子では0011 1111 1111 1111 1111 1111 1111 1011 00
になり黒い太字の部分が切り捨てられ青い部分が埋められました。つまり
0011 1111 1111 1111 1111 1111 1111 1011になります。
これを10進数表記に直します。まず、これは先頭の数字が0なので正の数になります。
正の数は負の数と違い反転したり1加えたりはしませんのでそのまま計算をしてやればいいのです。1 + 2 +8 + 16 + 32 + 64 + 128 + 256 + 512 + 1024 + 2048 + 4096 + 8192 + 16384
+ 32768 + 65536 + 131072 + 262144 + 524288 + 1048576 + 2097152 + 4194304
+8388608 + 16777216 + 33554432 + 67108864 + 134217728 + 268435456
+536870912 = 1073741819 ととんでもない数字になるわけです
y >>> 2; の値は 1073741819 になります。
ではサンプルプログラムで確認したいと思います。サンプルプログラム(Sample21.java)
class Sample21{ public static void main(String args[]){
int x = 20;
int y = -20; System.out.println(" x >>> 2 :" + ( x >>> 2));
System.out.println(" y >>> 2 :" + ( y >>> 2)); System.out.println(" y >> 2 :" + (y >> 2)); } }
プログラムをコピーする場合すべて選択をクリックしてください。
コンパイル・実行してみます。プログラムでも確認できました。