本日からは、基本情報技術者の資格勉強をしていきたいと思います。
まずは基礎理論①についてです。それではいってみますか!
基本情報技術者~基礎理論①~
小数部の計算
例えば、2進数の小数部があったとします。それを10進数に直すということをやってみたいと思います。
0.78125(10)
まず、2倍して小数部だけを次の計算に移していくということを繰り返します。
0.78125 | 0.5625 | 0.125 | 0.25 | 0.5 |
× 2 | × 2 | × 2 | × 2 | × 2 |
1.56250 | 1.1250 | 0.250 | 0.50 | 1.0 |
小数点が0になったところで、計算終了です。
整数部を並べてみると、0.11001となり、これが解となります。
逆算をしてみましょうか。
0.11001(2)
= 1 × 1/2 + 1 × 1/4 + 0 × 1/8 + 0 × 1/16 + 1 × 1/32
= 0.5 + 0.25 + 0 + 0 + 0.03125
= 0.78125(10)
一致しましたね。
今回は割り切れましたが、割り切れない場合は無限小数や循環小数なので、答えが無限に続くため、途中で計算を切り上げて構いません。
小数を10進数の分数で表す計算
基本情報技術者平成22年度の問題に次のようなものがでました。
問題
16進小数3A.5Cを10進数の分数で表したものはどれか。
解答
これは単純に、16進数から10進数への変換と、16進小数から10進小数への変換を行えば解けます。
私は、力技で解いてしまい、正解はしましたが、もっとスマートに解けたという自戒も含めて、この問題を取り扱いました。
3 | A | 5 | C | |
↓ | ↓ | ↓ | ↓ | |
3 × 161 | 10 × 160 | 5 × 16-1 | 12 × 16-2 | |
↓ | ↓ | ↓ | ↓ | |
(3 × 16) | (10) | (5 ÷ 16) | (12 ÷ 162) | |
↓ | ↓ | ↓ | ↓ | |
48 | 10 | 5 ─── 16 | 3 ─── 64 | |
↓ | ↓ | ↓ | ↓ | |
48 × 64 ───── 64 | 10 × 64 ───── 64 | 5 × 4 ───── 64 | 3 ───── 64 | 3735 = ───── 64 |
解は、3735/64となります。
分数を2進数の和で表す計算
基本情報技術者平成22年度の問題に次のようなものがでました。
問題
16進小数2A.4Cと等しいものはどれか。
解答
これは、16進数から10進数への変換を行い、さらに2進数に変換すれば解けますね。
16進数 | 2 | A | 4 | C |
↓ | ↓ | ↓ | ↓ | |
10進数 | 2 | 10 | 4 | 12 |
↓ | ↓ | ↓ | ↓ | |
2進数と10進数 | 0 0 1 0 × 27 26 25 24 | 1 0 1 0 × 23 22 21 20 | 0 1 0 0 × 2-1 2-2 2-3 2-4 | 1 1 0 0 × 2-5 2-6 2-7 2-8 |
↓ | ↓ | ↓ | ↓ | |
10進数 | 25 + | 23 + 21 | + 2-2 | + 2-5 + 2-6 |
となり、2A.4C(16)は25+23+21+2-2+2-5+2-6(10)であるということがわかります。
論理シフトを用いた計算
基本情報技術者試験では、論理シフトを用いたビットのかけ算わり算が主に出題され、算術シフトでのかけ算わり算はほぼ出題されない傾向があるそうです。
だから算術シフトの考え方を学ばなくて良いというわけではありませんが、論理シフトの考え方は楽なので助かりますね。
というわけで、基本情報技術者平成31年度の問題に次のようなものがでました。
問題
10進数の演算式7÷32の結果を2進数で表したものはどれか。
解答
これは、これは7÷32を計算して、2をかけて小数点以下の2進数を求めても解ける問題です。しかしもっと楽に解きたくありませんか?
というわけで、論理シフトを用いて解いてみます。
「7÷32」とは2進数「111」に「2-5」をかけたものと考えられます。「2-5」をかけるとはつまり、「111」のビット列を右方向に5つシフトさせることです。
0111.000000
→5つシフトする
0000.001110
つまり、0.00111が解答となります。
シフト演算の応用のいじわる問題
シフト演算は2のn乗で考えるということが基本となっています。しかし、基本情報技術者試験問題の中には2進数を5倍にする問題なども出題されます。こういった問題は、シフト演算とたし算の組み合わせで解いていきます。
例として、2進数101を5倍せよという問題があったとします。これをシフト演算とたし算の組み合わせに分けるとすると、次のようになります。
101(2) × 4 + 101(2)
この左側を先に解くと、
101(2) × 4 = 101(2) × 22 = 10100(2)
となります。これに101(2)を足すと、
11001(2)
となります。
これで2のn倍以外の計算問題がきても楽勝ですね!
シフト演算の応用のいじわる問題パート2
基本情報技術者試験の応用問題として、次のようなものもあります。
基本情報技術者平成29年度の問題です。
問題
数字を2進数で表すレジスタがある。このレジスタに格納されている正の整数xを10倍にする操作はどれか。ここで、桁あふれは起こらないものとする。
解答
解答の前に、答えのリストを挙げておきます。
ア.xを2ビット左にシフトした値にxを加算し、更に1ビット左にシフトする。
イ.xを2ビット左にシフトした値にxを加算し、更に2ビット左にシフトする。
ウ.xを3ビット左にシフトした値と、xを2ビット左にシフトした値を加算する。
エ.xを3ビット左にシフトした値にxを加算し、更に1ビット左にシフトする。
すべて解いてみましょう。
ア.(x × 22 + x) × 2 = 5x × 2 = 10x
イ.(x × 22 + x) × 22 = 5x × 4 = 20x
ウ.x × 23 + x × 22 = 8x + 4x = 12x
エ.(x × 23 + x) × 2 = 9x × 2 = 18x
従って、解はア.の10xとなります。
なんとなくで選ぶのではなく、しっかりと計算して答えを出せば、間違うことはなくなることでしょう。
最後に
いかがでしたでしょうか?
基本情報技術者勉強初日でした。皆さんのお役に立てるようなことがあったならば幸いです。
こちらが参考にさせていただいているテキストです。


ではでは、参考までに
コメント