シフト演算の基本

概要

最終更新日:2020/02/18

シフト演算の基本的な説明を書いた記事です。
主に次の項目に該当する方に向けて書いています。
  • シフト演算とは何か知りたい
  • 論理シフトとは何か知りたい
  • 算術シフトとは何か知りたい



シフト演算

シフト演算とはビットをずらす演算方法のことで、
右にずらすことを「右シフト」、左にずらすことを「左シフト」と呼んでいます。

computer_basics_0043

表現方法

シフト演算は「<」と「>」記号で演算を表現します。
まずは、右シフトは「ビット << シフトする数」と書きます。

computer_basics_0044

そして、左シフトは「ビット >> シフトする数」です。

computer_basics_0045

種類

シフト演算はシフトしたビットの結果が異なる二種類のシフトがあります。
  • 論理シフト
  • 算術シフト

論理シフト

論理シフトは符号なしのビットを左右にずらす演算で、
左右にシフトして空いた桁には「0」を埋め込みます。

computer_basics_0046

算術シフト

算術シフトはビットを符号付きの2進数として左右にずらす演算です。
論理シフトとは異なり、左右で埋める数の内容が異なるので、
まずは簡単な左シフトから説明します。
符号部が「0」の「0101」を2桁分左シフトさせてみます。

computer_basics_0047

左シフトの場合は論理シフトと同じように空いた桁の部分には「0」を埋め込みます。
ただ、論理シフトと違うところは符号部はシフトされず、仮数部のみがシフトされます。
次は、符号部が「1」の「1001」を2桁分右シフトします。

computer_basics_0048

右シフトの場合は埋め込まれる数は符号部の数を使います。
今回は「1001」で符号部は「1」なので、埋め込まれる数は「1」です。
これが論理シフトの時の「0110」ならば符号部は「0」なので、
埋め込まれる数は「0」になります。

掛け算と割り算

シフト演算では左シフトで掛け算、右シフトで割り算を行うことができます。
式は以下の通りです。
  • 掛け算
    ビット * (基数)シフト数
  • 割り算
    ビット * (基数)-シフト数
例えば(0011 0100)2を2桁分シフトするとしたら
掛け算は(2)2で4倍に、割り算は(2)-2で1/4になります。

2進数 答え 10進数 答え
 0011 0100   0011 0100 << 2   1101 0000   52   52 × 4   208 
 0011 0100   0011 0100 >> 2   0000 1101   52   52 ÷ 4   13 

まとめ

今回の記事の要点を最後にまとめました。
  • シフト演算はビットを左右にずらす演算
  • 論理シフトはずらされて空いた桁を0で埋める
  • 算術シフトの右シフトはずらされて空いた桁を符号部の数で埋める
  • 算術シフトの左シフトはずらされて空いた桁を0で埋める
  • シフトで掛け算と割り算ができる
    右シフトは(基数)シフト数 左シフトは(基数)-シフト数