ビットシフト
読み:ビットシフト
外語:bit shift
レジスターや変数のビット列を右方向ないし左方向にずらすビット演算。
概要
符号ビットの扱いにより、算術シフトと論理シフトに分けられる。
ビットシフト演算では、左に1ビットずらすと整数値は2倍に、右に1ビットずらすと整数値は1/2倍になる。
乗算
手法
ビットシフト演算のみでは、2±nの計算しかできないため常に偶数倍または偶数分の一(正確には2の累乗)しか求められないが、これに加算を加えれば、奇数倍を求めることも可能である。ただし、奇数分の一(正確には2の累乗でない数を割る数とする除算)は簡単には実現できない。
高級言語の場合はコンパイラー次第であるが、アセンブリ言語の場合、CPUが持つ乗算命令や除算命令を用いるより高速に結果を求められるため、古くよりよく使われている。
サンプル
xが引数、yに結果を入れるとすると、次のようになる。
- 2倍 y = x << 1;
- 3倍 y = (x << 1) + x;
- 4倍 y = x << 2;
- 5倍 y = (x << 2) + x;
- 6倍 y = (x << 2) + (x << 1);
- 7倍 y = (x << 2) + (x << 1) + x;
- 8倍 y = x << 3;
- 9倍 y = (x << 3) + x;
- 10倍 y = (x << 3) + (x << 1);
- 11倍 y = (x << 3) + (x << 1) + x;
- 12倍 y = (x << 3) + (x << 2);
- 13倍 y = (x << 3) + (x << 2) + x;
- 14倍 y = (x << 3) + (x << 2) + (x << 1);
- 15倍 y = (x << 3) + (x << 2) + (x << 1) + x;
- 16倍 y = x << 4;
必要な組み合わせが増える倍率の場合は乗算命令を使うより遅くなる可能性があるが、古く8ビットMPUや一部の16ビットMPUなどのように乗算命令や除算命令を持たないMPU、持っていても非常に遅いMPUなどでは、アセンブリ言語でプログラミングする際に有用なノウハウであった。
再検索