「シフト演算」は、特殊な計算方法です。シフト演算は、数値を2進数として見て、計算を行います。
プログラムを書き始めた時には、このシフト演算はあまり使うことがありません。そのため、初めの内はこの内容は読まなくても構いません。
シフト演算を行う記号は「シフト演算子」と呼びます。「<<」は「左シフト」、「>>」は「右シフト」と呼びます。
たとえば「4」という数字は、2進数では「100」です。「<<」を使って「4 << 2」という計算を行うと、2進数の桁が2上がり「100」が「10000」になります。この結果、値は10進数で16になります。
逆に「>>」を使って「4 >> 1」という計算を行うと、2進数の桁が1下がり「100」が「10」になります。この結果、値は10進数で2になります。
4 << 2 →2進数で表記→ 100 << 2 → 10000 →10進数で表記→ 16 4 >> 1 →2進数で表記→ 100 >> 1 → 10 →10進数で表記→ 2
さて、右側にシフトする演算子は「>>」と「>>>」の2種類があります。
このうち「>>」は符合を維持して値を小さくします。「>>>」は符合を無視してビットの値を右側に移動します。
この処理の違いは変数のメモリ内の仕組みを理解する必要があります。
Javaの数値変数では、値のメモリの先頭が0の場合には正の数、1の場合には負の数になっています。たとえば「凸凸凸凸」という4つのスイッチを使っている場合は、「0なら正で1なら負、数字用、数字用、数字用」となっています。
マイナスの数字の場合は、「1 010」のように先頭が1になります。そのため、メモリ内の値を1つ右にずらして先頭を0で埋めると「0 101」となり、符合が変わってしまいます。しかし、「1 101」と符合が維持された方が都合がよいケースもあります。
こういった問題に対処するために、右シフトには2つの記号が用意されています。
「>>」では、符合を維持してシフト処理を行います。「>>>」では先頭を0で埋めてシフト処理を行います。
System.out.println(-4 >> 1); // 「-2」と出力 System.out.println(-4 >>> 1); // 「2147483646」と出力