はじめに
先日受験した医療情報技師試験ですが、自己採点の結果、無事に合格ラインをクリアできている見込みです! ただ、「情報処理技術」の科目でいくつか悔しい間違いをしてしまいました。10月に控える基本情報技術者試験(FE)に向けて、間違えた問題を「一記事一問」のスタイルで徹底的に深掘りし、知識を完璧に定着させていきたいと思います。
記念すべき第1回は、ITの超基本である「基数変換(10進数→16進数)」です。
実際に出題された問題と私のつまずき
【第24回 情報処理技術系 問1】
10進数「182」を16進数に変換したのはどれか。
- 91
- AD
- B6
- F2
- 116
正解は「3) B6」なのですが、私は本番で焦ってしまい、計算用紙に色々書き込んだ末に間違えてしまいました。16で割る計算自体はできても、「出た余りを正しくアルファベット(A〜F)に変換する」という最後の詰めでミスが起きやすいのがこの問題の罠です。
【図解】10進数から16進数へ変換する3ステップ
確実にとけるように、ルールを改めて整理します。鉄則は「商が0になるまで16で割り続け、余りを下から上へ拾う」ことです。
ステップ1:16で割って余りを出す
- 182 ÷ 16 = 11 ・・・ 余り 6
- 11 ÷ 16 = 0 ・・・ 余り 11
商が0になったので計算はここまで。余りを下から拾うと「11」と「6」になります。
ステップ2:10以上の数字をアルファベットに変換する 16進数は「0〜9」までの数字と「A〜F」のアルファベットを使います。 (A=10, B=11, C=12, D=13, E=14, F=15)
今回、余りの一つが「11」なので、これを「B」に変換します。
ステップ3:下から順にくっつける 下から拾い上げた「B」と「6」をくっつけて、答えは B6 となります。
1. まずは全体像!基数変換の対応表(0〜15)
2進数、8進数、16進数はすべて「2の累乗(2の仲間)」です。コンピューターが処理する長い長い2進数を、人間が見やすく短くまとめるために8進数や16進数が存在します。
| 10進数(普段の数) | 2進数(マシンの言葉) | 8進数(3桁まとめ) | 16進数(4桁まとめ) |
| 0 | 0000 | 0 | 0 |
| 1 | 0001 | 1 | 1 |
| 2 | 0010 | 2 | 2 |
| 3 | 0011 | 3 | 3 |
| 4 | 0100 | 4 | 4 |
| 5 | 0101 | 5 | 5 |
| 6 | 0110 | 6 | 6 |
| 7 | 0111 | 7 | 7 |
| 8 | 1000 | 10 | 8 |
| 9 | 1001 | 11 | 9 |
| 10 | 1010 | 12 | A |
| 11 | 1011 | 13 | B |
| 12 | 1100 | 14 | C |
| 13 | 1101 | 15 | D |
| 14 | 1110 | 16 | E |
| 15 | 1111 | 17 | F |
2. 10進数を中心とした変換(基本ルート)

私たちが普段使っている10進数を基準にする場合、ルールは「割る」か「掛ける」の2択です。
① 10進数 → N進数にする(割り算ルート)
変換したい進数(N)で、商が0になるまで割り続け、余りを下から上へ拾います。
- 10進数 → 2進数: 2で割り続ける
- 10進数 → 8進数: 8で割り続ける
- 10進数 → 16進数: 16で割り続ける(余りが10〜15になったらA〜Fに変換!)

② N進数 → 10進数にする(掛け算ルート)
各桁に「重み(Nの累乗)」を掛けて、すべて足し合わせます。右端から「1、N、Nの2乗、Nの3乗…」となります。
- 2進数 → 10進数: 各桁に右から
1, 2, 4, 8, 16...を掛けて足す - 8進数 → 10進数: 各桁に右から
1, 8, 64, 512...を掛けて足す - 16進数 → 10進数: 各桁に右から
1, 16, 256, 4096...を掛けて足す(A〜Fは10〜15に戻して計算!)
3. 2・8・16進数同士の変換(ショートカットルート)
ここがFE試験でも一番の時短テクニックになる部分です。2、8、16進数は「2の仲間」なので、わざわざ10進数を経由しなくても、「桁を区切るだけ」で一瞬で変換できます。
① 2進数 ⇄ 8進数(3桁区切り)
8は「2の3乗」なので、2進数の「3桁」が8進数の「1桁」にピッタリ対応します。
例:2進数
101011を 8進数にする
- 右から3桁ずつ区切る →
101と011- それぞれを10進数っぽく読む →
101は「5」、011は「3」- くっつける → 8進数の 53
② 2進数 ⇄ 16進数(4桁区切り)
16は「2の4乗」なので、2進数の「4桁」が16進数の「1桁」にピッタリ対応します。
例:2進数
10101111を 16進数にする
- 右から4桁ずつ区切る →
1010と1111- それぞれを読む →
1010は「10(A)」、1111は「15(F)」- くっつける → 16進数の AF
③ 8進数 ⇄ 16進数(2進数経由が最強)
8進数から16進数(またはその逆)に直接変換しようとすると頭が混乱します。「一旦2進数にバラしてから、区切り直す」のが一番ミスがなくスピーディです。
例:8進数
75を 16進数にする
- 3桁の2進数にバラす →
7は111、5は101→ 繋げて111101- 右から4桁で区切り直す →
11と1101- 16進数で読む →
11(3)と1101(D)→ 16進数の 3D
このように「グループ」で理解しておくと、基本情報のアルゴリズム問題でシフト演算(ビットを左右に動かす処理)などが出てきたときにも、頭の中で数字がどう動いているのかイメージしやすくなります。
【開発者視点のひとこと】 現在学習しているJavaScriptを使えば、実は (182).toString(16) と1行書くだけで、裏側で勝手に b6 と計算してくれます。Webアプリで色を指定するカラーコード(#FFFFFFなど)でおなじみですね。 ただ、10月の基本情報(FE)の科目Bでアルゴリズムを読み解くには、こうした「裏側でコンピューターがどんな計算をしているか」の仕組みを理解しておくことが非常に重要になります!

コメント