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