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進数でかけ算をしよう(算術シフト)
次回は符号も考慮したシフト演算の話です。