本記事では基本情報技術者試験にも出題される論理シフトについて解説しています。目次は以下の通りです。
シフト演算とは
前提としてコンピュータ上では厳密には加算演算しかできないです。
ただ、現実としてかけ算や割り算をコンピュータ上で行いたいですよね。そこで登場するのがシフト演算です。シフト演算は左右のビットをずらすことにより乗除の演算をすることをいいます。シフト演算には論理シフトと算術シフトがあります。本記事では論理シフトにフォーカスして説明します。
論理シフト
論理シフトは符号について考えないシフト演算です。なので、先頭に符号ビットのないビット列で行われます。論理シフトには論理左シフトと論理右シフトの2種類があります。操作方法は以下で確認しましょう。
論理左シフト
論理左シフトは整数のかけ算を論理シフトで表すものです。
具体例を以下に示します。
\( 00001010_{(2)} \)を2倍すると仮定します。
一回10進法に直す方法で行うと、
$$ 1010_{(2)}=2^3+2=10_{(10)} $$
$$ 10\times 2=20 $$
$$ 20_{(10)}= 10100_{(2)}$$
となります。
一方で左シフトを用います。2倍は2の1乗なので、左に1ビット分シフトすればいいのです。
そうすると次のようになります。
よって、答えが\( 00010100_{(2)} \)となり、10進法に直したときと同じようになります。
ちなみに4倍だと2の2乗なので、左に2つ、8倍だと2の3乗なので、左に3つシフトすることができます。
論理右シフト
論理右シフトは整数の割り算を論理シフトで表すものです。なので、左シフトと逆のパターンですね。
具体例を以下に示します。
\( 00001010_{(2)} \)を2で割る、すなわち\( \frac{1}{2} \)倍すると仮定します。
一回10進法に直す方法で行うと、
$$ 1010_{(2)}=2^3+2=10_{(10)} $$
$$ 10\times\frac{1}{2}=5 $$
$$ 5_{(10)}= 101_{(2)}$$
となります。
一方で右シフトを用います。
\( \frac{1}{2} \)倍は\( \frac{1}{2} \)の1乗なので、右に1ビット分シフトすればいいのです。
そうすると次のようになります。
よって、答えが\(00000101_{(2)} \)となり、10進法に直したときと同じようになります。
ちなみに\( \frac{1}{4} \)倍だと\( \frac{1}{2} \)の2乗なので、右に2つ、\( \frac{1}{8} \)倍だと\( \frac{1}{2} \)の3乗なので、右に3つシフトすることができます。
まとめ
本記事のポイントを以下にまとめます。
・シフト演算とは左右のビットをずらす演算
・論理シフトはビット列の先頭に符号ビットがないときに用いられる
・論理左シフトと論理右シフトがある
コメント