シフト演算とは論理演算と同じようにビットを操作する命令である。具体的には、
2進数の各ビットをずらすことである。右にずらすか左にずらすか、符号なしか、符号付きか
によって3種類の演算子が
用意されている
演算子 |
意 味 |
使用法 |
<< |
左にシフト |
a = b << c |
bを左にcビットずらす |
>> |
右にシフト |
a = b >> c |
bを右にcビットずらす(符号付き) |
>>> |
右にシフト |
a = b >> c |
bを右にcビットずらす(符号なし) |
一概にシフトするといっても、ずらすデータが符号付き整数か、符号なし整数かによって、
動作が異なる。符号なし整数と言っても、JavaではC言語と異なり、unsignedは存在しないので、
単なるビット列として扱いたい場合は、符号なし整数と考える。
なお、floatやdouble、後述するポインタ型には使用できない。
まず、符号なし整数(単なるビット列)のシフト命令について説明する。
これらは論理シフトと言い、ずらして足りなくなる1桁には無条件に0が入る(下図参照)。
次に、符号付き整数のシフトを説明する。符号付き整数は、上位1bitが符号を表している。
この符号を壊さないようにシフトさせる(下図参照)。この理由は後述する。
さて、シフトを行うとデータはどうなるのだろうか?まず、左にずらした時の例を示す。
このように左にずらすと、その値は2倍になる。
次に、右にずらすことを考える(下図参照)。
右にずらす場合、符号付き整数(>>)と負号なし整数(>>>)でこのような差がでる。