ビットシフトと2進数

ビットシフトと2進数

 ビットシフトはデジタル回路で多用するテクニックですが、使いこなせていない場合が多く、右シフトとか左シフトとかの定義が覚えらえない人がいます。

 まず、一般的な10進数で考えてください。”50″という数字を10倍したければどうしますか?

 50 × 10 = 500

 というのは小学校で習います。ビットシフトはこれと同じことをしているのです。

 10進数の場合、左に1桁ずらせば10倍。右に1桁ずらせば1/10というのは誰もが理解できると思います。図で示すと次のようになります。

 青い文字部分は比較的わかりやすいです。”50″を10倍するには、左に”50″を移動して、右の空いた桁に”0”を書きます。したがって、10倍、100倍、1000倍という計算は比較的簡単にできるのは、経験上理解できると思います。

 同様に1/10、1/100、1/1000というのも、桁を右にずらして、小数点以下の”0″は記載しない。というのも気が付くと思います。

 ビットシフトというのはこの動作を”シフト”という言葉で言っているだけで、10倍の時には左に移動。1/10の時には右に移動。というのは頭でわかっているのですが、「左ビットシフト」と言われると、どっちだっけ?になる人が多いのです。

 これまで、10進数で説明しました。10進数は10倍、100倍、1/10倍という10進数を基準に考えていましたが、 そもそも、10進数の時の10倍、100倍というのはべき乗で書くと、10、10となっているだけです。

10=10倍

10=100倍

 つまり、10倍は桁ずらしを1回。100倍は桁ずらしを2回行う。ということです。ここまでで、かなり理解できたと思いますが、桁ずらし1回、2回。というのをビットシフト1回。ビットシフト2回。というように数えるのと同じです。

 さらに、べき乗には意味があって、10の2乗は 10×10 というのが理解していると思うのですが、これが2進数になると、途端にわからなくなる。という人が多いのです。

 10の2乗は100倍です。2の2乗は?

 2 × 2 = 4

 なので、2の2乗は”4″です。2の3乗は”8″です。10進数との違いが分かったでしょうか?

 2進数の場合

  22 = 4、 23 = 8、 24 = 16

 10進数の場合

  102 = 100、 103 = 1000、 104 = 10000

 ここまでの話をまとめると、10進数の場合、左に1つシフトすると、10倍(101)。左に2つシフトすると100倍(102)。3つシフトすると1000倍(103)になります。

 同じく、2進数の場合にも、左に1つシフトすると2倍(21)。左に2つシフトすると4倍(22)。3つシフトすると8倍(23)になります。このようにべき乗が大切になるのがわかると思います。このべき乗はシフトする数と一致しますので、2を左に2つシフトすると22=4倍という計算ができるのを理解してください。

 図で示すと次のようになります。”101″を2倍すると、”1010″になります。これは2倍=21なので、1回左にシフトすることを意味します。

 右シフトの場合も同じく、1/21や1/22、1/23などのようにべき乗は同じ振る舞いをします。

 ここで、2進数の場合、2、2、2の計算が簡単になる。ということも10進数の時と同じです。10進数の時には、10倍、100倍が簡単でした。同じように、2進数の場合には2倍、4倍、8倍が簡単になります。

 このようにビットシフトは2進数の計算の基本になりますので、必ずマスターしてください。