>>>演算子

この演算子も右シフト演算子と同じですが、正負にかかわらず左端に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

4 + 1 = 5

したがって

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

4 + 1 = 5 でこの2進数は先頭に1がつけられていたので負の数でした。

したがって y >> 2; の値は -5になります。

Sponsored link

y>>> 2 の求め方

まず、2進数の求め方は上記を参照してください!

int y = -20; の2進数表記は以下のようになります。

1111 1111 1111 1111 1111 1111 1110 1100

ここからが>>演算子と>>>演算子の異なるところです。
>>演算子数値が負のときは右辺だけ右にシフトし左端に1を埋めるのに対し
>>>演算子数値が負のときは右辺だけ右にシフトし左端に0を埋めるのです。

つまり 先ほどの2進数で表された int y = -20;

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)); } }

プログラムをコピーする場合すべて選択をクリックしてください。

コンパイル・実行してみます。

プログラムでも確認できました。

ページのトップへ戻る