【シフト演算】シフト演算の基礎知識〜論理シフトと算術シフトまで解説!

【シフト演算】シフト演算の基礎知識〜論理シフトと算術シフトまで解説!
ハテオ君

IT資格の受験に向けて勉強しているがシフト演算というのが出てくるが全く意味がわからないなぁ。基礎知識をわかりやすく学べないかな?

今回はこの悩みを解決していきます。

本日の記事テーマ

シフト演算の基礎知識〜論理シフトと算術シフトの特徴まで徹底解説!

コンピューター内部では、シフト演算を用いて演算処理を行なっています。

このシフト演算はIT資格の試験などではよく出題されるため、勉強中の方に関してつまずくところだと思います。

基礎知識を理解できればそこまで難しくないので、今回の記事を参考にしてシフト演算の基礎知識を身につけていきましょう。

本日の記事内容

  • シフト演算の基礎知識
  • シフト演算の種類(論理シフトと算術シフト)

記事の最後には、今回の内容に関しての確認問題も用意していますので、インプットとアウトプットとしても是非活用してみてください。

元中卒の私が誰でも理解できるように解説していきます。

それでは早速見ていきましょう!

黄島 成

シフト演算の基礎知識

シフト演算の基礎知識

シフト演算とは何か?

シフト演算とは、2進数で表すビット列を左または右にズラす操作のこと。

具体的には、10進数の100という数字を10倍すると、「1000となる。逆に10/1倍にすると「10となります。

このように、10倍にすると1桁増やし、10/1倍すると1桁減らす操作がシフト演算です。

コンピューター内部ではこのようにシフト演算を用いています。

10進数と2進数のシフト演算の具体例

ではまず、10進数の123で考えてみましょう。

  • 1つ左に桁をずらすと、元の数値に10を掛けた1230となる。
  • 2つ桁をずらすと、100を掛けた12300となる。

逆に 1 つ右に桁をずらすと元の数を10で割った12.3に、2つ右に桁をずらすと100で割った 「1.23」となる。

10進数シフト演算図

10進数では左右に桁をずらすだけで、10を掛けたり割ったりすることが可能です。

2進数のシフト演算の具体例

では次に、2進数の100で考えてみましょう。

2進数の場合でも上記と同じように、左右に桁をずらすだけで元の数値に2を掛けたり、2で割ったりすることができます。

  • 100を2倍にすると1000となる。
  • 100を2/1倍にすると10となる。
10進数シフト演算図

この様に、左右に桁をずらすことで、簡単に乗算や除算を行うことができます。

  • 100を2倍にすると1000となる。
  • 100を2/1倍にすると10となる。

シフト演算の種類(論理シフトと算術シフト)

シフト演算の種類(論理シフトと算術シフト)

シフト演算には、以下2つの種類が存在します。

  • 論理シフト
  • 算術シフト

順番に詳しく見ていきましょう。

シフト演算①:論理シフト

論理シフトとは、符号を考慮しないシフト演算です。

倫理シフトでは、あふれたビットは捨てられる左シフトと、空いたビットに0が入る右シフトが存在します。

論理左シフト

論理左シフトは、ビット列全体を左にズラす論理シフトをのことです。

8ビット列の場合以下図の通り

論理左シフト図

左にずらしたビット数をnとすると、論理左シフト後は元の数の2のn乗倍したものです。

上記図の場合は、左に2ビットずらしているので、論理左シフト後の値は、「12×2×2=48」と元の数を2の2乗倍した値となっています。

論理左シフトでは、あふれたビットは切り捨てられます。

しかし「0」ではなく「1」があふれた場合は「オーバーフロー」というビット列で表せる数の限界を超える現象現象が起こります。

論理右シフト

論理右シフトとは、ビット列全体を右にズラす論理シフトのことです。

8ビット列の場合以下図の通り

論理右シフト図

右にズラしたビット数をnとすると、論理右シフト後は元の数を2/1のn乗倍したものです。

上記図の場合は、右にズラしているので、絵おんり右シフト後の値は「12÷2÷2=3」と元の数を2/1の2乗倍した値となっています。

論理右シフトでは、あふれたビットは切り捨てられ空いたビットには、「0」が入ると覚えておきましょう。

シフト演算②:算術シフト

算術シフトとは、符号も考慮して行うシフト演算です。

特徴としては、

  • リ正の数=0
  • 負の数=1

として扱います。左シフトと右シフトでは、空いたビットの取り扱い方が異なります。

算術左シフト

算術左シフトは、符号ビットはそのままの位置にとどまります。

あふれたビットは捨てられ、空いたビットには 0 が入ります。

<こ8ビット列の場合以下図の通り

演算左シフト図

先頭は符号ビットで同じなので、シフト操作は残りの7ビットに対して行われます。

上記図の場合は、符号ビットが「1」(マイナスの値)である(10進数で-28)を左に2ビットずつズラしています。

その結果、「-28×2×2=-112」と元の数を2の2乗倍した値となっています。

算術左シフトでは、符号ビットはそのまま、あふれたビットは捨てられる。

しかし、オーバーフローが起こるので、空いたビットには0が入る。

算術右シフト

算術右シフトは、符号ビットはそのまま、あふれたビットは捨てられ、空いたビットには符号と同じビットが入ります。

8ビット列の場合以下図の通り

算術右シフト図

先頭は符号ビットで固定なので、シフト操作は残りの7ビットに対して行われます。

上記図の場合は、符号ビットが「1」(マイナスの値)である(10進数で-28)を右に2ビットずつズラしています。

その結果、「-28÷2÷2=-7」と元の数を2/1の2乗倍した値となっています。

算術右シフトでは、符号ビットはそのままであふれたビットは捨てられる。空いたビットには符号と同じビットが入る。

シフト演算と言われたら、nビット左シフトは 2n倍、nビット右シフトは1/2n倍と覚えましょう。

今回のまとめ&確認問題

【シフト演算】シフト演算の基礎知識〜論理シフトと算術シフトまで解説!まとめ

シフト演算については上記内容で以上となります。

それではまず今回の内容をまとめていきましょう。

まとめ

  • コンピューター内部では、数字の桁を右や左にズラすことで掛け算や割り算を行なっている
  • 論理シフトは、符号を考慮しないシフト演算
  • 算術シフトは、符号も考慮して行うシフト演算

今回の確認問題「アウトプット用」

確認問題

情報処理の確認問題③

「次へ」で問題スタート!

①解説

【問題①】

32ビットのレジスタに16進数ABCDが入っているとき、2ビットだけ右に論理シフトしたときの値はどれか。

:2AF3 正解〇
:6AF3 不正解×
:AF34 不正解×
:EAF3 不正解×

【解説】

16進数ABCDを2進数に変換すると次のようなビット列になります。

1010 1011 1100 1101

論理シフトでは空いたビットを0で埋めるので2ビット分だけ右に論理シフトすると、結果は以下通り。

0010 1010 1111 0011

最後にこれを4ビットずつまとめて16進数に戻すと答えは「2AF3」になります。

つまり答えは「」となる。

②解説

【問題②】

10進数の演算式7÷32の結果を2進数で表したものはどれか。

:0.001011  不正解×
:0.001101  不正解×
:0.00111  正解〇
:0.0111  不正解×

【解説】

7÷32は7/32と表記できるので、これを3つに分解します。

4/32+2/32+1/32

さらに約分を施し、

1/8+1/16+1/32

次のように分母を2の累乗で表すと、

1/23+1/24+1/25

上記のように変換できます。これを2進小数で表すと「0.00111」となります。

つまり答えは「」となる。

③解説

【問題③】

数値を2進数で表すレジスタがある。このレジスタに格納されている正の整数xを10倍する操作はどれか。ここで、桁あふれは、起こらないものとする。

:xを2ビット左にシフトした値にxを加算し、更に1ビット左にシフトする。
正解〇
xを2ビット左にシフト→xの4倍
xを加算→xの5倍
上記の値を1ビット左にシフト→5倍の2倍=xの10倍

:xを2ビット左にシフトした値にxを加算し、更に2ビット左にシフトする。
不正解×
xを2ビット左にシフト→xの4倍
xを加算→xの5倍
上記の値を2ビット左にシフト→5倍の4倍=xの20倍

:xを3ビット左にシフトした値と、xを2ビット左にシフトした値を加算する。
不正解×
xを3ビット左にシフト→xの8倍
xを2ビット左にシフト→xの4倍
上記の値を加算→8倍+4倍=xの12倍

:xを3ビット左にシフトした値にxを加算し、更に1ビット左にシフトする。
不正解×
xを3ビット左にシフト→xの8倍
xを加算→xの9倍
上記の値を1ビット左にシフト→9倍の2倍=xの18倍

【解説】

2進数のビット列は、左にnビットシフトすると元の値と比べて「2n」、右にnビットシフトすると「1/2n倍(2-n倍)」になるという性質があります。

つまり、2ビット左にシフトすると元データの4倍、3ビット左にシフトすると元データの8倍の値になります。

問題では元データxを10倍にするという事ですので上記の基本を踏まえた上で上記の問題を見てみましょう。

最後まで読んでいただきありがとうございました!

今回の内容が、役に立ったな!と思ったらシェア&ブクマ登録よろしくお願いします。

また、質問や問い合わせに関しては、コメント欄かお問い合わせフォームを活用ください。

それではまたお会いしましょう。

黄島 成

-情報処理
-