旧gaaamiiのブログ

間違ったことを書いている時があります。コメントやTwitter、ブコメなどでご指摘ください

2進数でかけ算をしよう(論理シフト)

前回:1-3 2進数で引き算をしよう -基本情報技術者試験-


例題

H16.春 問4
32 ビットのレジスタに 16 進数 ABCD が入っているとき、2ビットだけ右に論理シフトしたときの値はどれか。
ア 2AF3     イ 6AF3     ウ AF34     エ EAF3

手順

1. ABCDを2進数に変換する

16進数 A B C D
10進数 10 11 12 13
2進数 1010 1011 1100 1101

2. 32ビットのレジスタに入れる

0000 0000 0000 0000 1010 1011 1100 1101

3. 2ビット右に論理シフトする

これを...

0000 0000 0000 0000 1010 1011 1100 1101

2ビット右に論理シフトする。

0000 0000 0000 0000 0010 1010 1111 0011

4. 2進数を16進数に変換する

16進数に戻します。

2進数 0010 1010 1111 0011
10進数 2 10 15 3
16進数 2 A F 3

よって、答えはア。

解説

考え方

やることとしては何一つ難しいことはありません。基数変換の復習になって、良い例題だと思います。

論理シフトとは

論理シフトとは「符号を考えずにするシフト演算」のことです。といってもシフト演算てなんだよ、って話です。

シフト演算とは

数字を動かして空いたスペースに0を入れることでかけ算をする、という演算方法です(1を入れる場合もあるけどそれは次回)。10進数で表すとこんな感じです。


10 × 10 = 100

10

左に1つシフトすると

100

10 × 1/10 = 1

10

右に1つシフトすると

1

こんな感じのことを2進数でしているのが例題の手順3の部分です。

はみ出てる部分はどうするか

例題では2ビットシフトした分、末尾の01がはみ出てます。このはみ出た部分は余りです。わかりやすく10進数で右に1ビットシフトしたとして考えるとこんな感じ。

105
10 余0.5

逆もあります。日常生活ではなかなか無いですが、コンピュータが演算をするときにはビット数の縛りがあるので、左にはみだします。例えば4ビットの1010という数値で考えると、

1010

1ビット左にシフト

0100

こんな感じです。1がはみ出てしまいました。このはみ出た部分をオーバーフローと言います。日本語で「桁あふれ」とか言うとなんかかっこ悪いのでオーバーフローで覚えましょう。

(次回) 2進数でかけ算をしよう(算術シフト)

次回は符号も考慮したシフト演算の話です。