基数

テクノロジ系

テクノロジ系 > 大分類1 基礎理論 > 中分類1 基礎理論 > 1.離散数学 > (1) 基数

この章では基数の基本的な事柄について学びます。

(1)基数

2 進数,8 進数,10 進数,16 進数,n 進数の表現,2 進数と 10 進数などの基数の変換手法を理解する。

基数(radix)とは、何種類の記号を使用して数値を表すかを示す数です。一般的に「r進数」と呼んだ場合のrが基数となります。

例えば、普段私たちが使っている数値表現は10進数です。これは0~9までの10個の記号(数字)で数値を表し、基数は10です。

コンピュータの世界では2進数が用いられます。これは0と1の2つの記号で数値を表し、基数は2です。また、2進数と相性が良いことからコンピュータの世界では8進数と16進数が良く用いられます。8進数は0~7の8個の記号で数値を表し基数は8、16進数は0~9とA,B,C,D,E,Fの16個の記号で数値をで表し、基数は16です。

基数による数値の表し方はは無数にありますが、コンピュータでよく扱うのが2進数、8進数、16進数と普段私たちが使っている10進数です。基本的にはこの4つについての表現方法を覚え、相互変換ができるようになっておきましょう。特に2進数は重要で、ネットワーク分野のIPアドレスでは分からないと問題が解けません。しっかりと理解しておきましょう。

10進数、2進数、8進数、16進数

10進数、2進数、8進数、16進数の対応は以下の表の通りになっています。

この表を使えば例えば10進数→2進数のように変換することが可能です。しかし、10進数100のような数値の変換をする場合にはそれなりの大きな表を持っていないといけないですし、本試験の時に表を書き出すのは現実的ではないです。よって、表を用いないで相互変換ができるように練習しておく必要があります。この章では桁の重みについて学んだあと、最も大事な10進数と2進数の相互変換を学び、その知識を基にそのほかの相互変換もできるように練習します。

なぜコンピューターは2進数を使用するのか?
20世紀に開発された現代のコンピュータの仕様によるものです。コンピュータの内部では電圧が高いと1、低いと0のように決めておき、その組み合わせによってあらゆる表現を行うことにより動いています。この仕組みの詳しい内容については「大分類2 コンピュータシステム」で勉強します。

なぜ8進数と16進数を使用するのか?
コンピュータは2進数を使用しますが、2進数は0と1の羅列であり、桁数が非常に大きくなるなど人間が見ると非常に分かりにくい表現です。そこで桁数が減り少し見やすい表現とするために用いられるのが8進数と16進数です。8進数は2の3乗、16進数は2の4乗であることから桁の繰り上がるタイミングが2進数と同じで、2進数との相互変換がしやすいことから用いられます。現在は8進数よりも16進数の方がよく用いられている表現ですので、優先的に覚えましょう。2進数との相互変換はこの後に勉強します。

桁の重みと重み表

桁の重みとは、各桁の単位のことをいいます。

例えば10進数の場合は1の位、10の位、100の位と言いますが、この「位」にあたる数のことが桁の重みです。そして1、10、100という数値はそれぞれ基数である10の0乗、1乗、2乗になっています。

重みを一覧にしたものを重み表といいます。10進数の重み表は以下の通りです。

10進数の重み表

2進数の場合は基数である2を累乗していくことにより重みを計算できます。2進数の重み表は以下の通りです。

2進数の重み表

8進数や16進数も同様に重み表を作成することができます。

重み表を使用するとr進数⇔10進数の基数変換を行うことができます。具体的な手順は次で解説します。

基数変換

r進数⇔10進数の相互変換

r進数⇔10進数の相互変換は重み表を使って変換します。

2進数→10進数

2進数10010を10進数に変換してみることで手順を示します。

① 2進数の重み表を作成する。
2進数の桁数によって表の大きさは異なりますが、今回は5桁分の重み表を書き出します。

2進数の重み表

2進数の重み表は非常によく使用することになります。IPアドレスでは8桁の重み表を使用するので、8桁くらいまでは素早く作成できるように練習するとよいでしょう。

2進数の重み表(8桁分)

② 作成した重み表の下に2進数の数値を書き込む。
一つの重みに対して一つずつ2進数を書き出します。

③ 重み×2進数の桁の掛け算をする
重みの値と2進数の桁の値を掛け合わせ、その下に書き出します。2進数は0と1しかないため、実際には2進数で1の桁のところ重みがそのまま下に書き出される形になります。

④ ③で書き出した値をすべて足し算する

10進数→2進数

先ほど変換した10進数18を今度は2進数に戻してみましょう。

① 2進数の重み表を作成する
重み表のサイズはこの後の②によって変わります。

②  重み ≦ 10進数の数値 となるもののうち、重みが最大のものを探して、その重みの下に10進数の数値を書き込む
ここは少し手順が難しいです。下の図のように考えて適切な位置に10進数の数値を書き込みます。

③  10進数の数値÷重みの計算を行い、商を10進数の数値の下に、あまりを10進数の数値の右側の重みの下に書き込む
2進数の場合は商は必ず1になり、あまりは「10進数の数値-重み」になります。しかし、他の基数で応用するために「10進数の数値÷重み」の商とあまりであることは覚えておきましょう。

④  ③で書き込んだあまりの値について、重み ≦ あまりの数値となるもののうち、重みが最大のものを探して、その重みの下にあまりの数値を書き込む
③で書いたあまりの値について②と同じようなことをします。これも手順が少し難しいため練習が必要です。

⑤  ④で書き込んだあまりの値 ÷ 重みの計算を行い、商をあまりの下、あまりを右側の重みの下に書き込む
③と同様の手順となります。

⑥  ④⑤をあまりが0になるまで繰り返す
この例では既に余りが0になったのでここで終了です。

⑦  商を書き込んだ列で空白になっているところを0で埋めると2進数に変換されている

やや複雑なので練習が必要です。何回かやっているとわかってくると思いますが、割り算を行って商を書き込む部分の商は必ず1になり、あまりは10進数の数(orあまり)とその桁の重みを引いた数になります。このコツをつかむと素早く変換できるようになってきます。

10進数→2進数(別解)

10進数→2進数変換は以下のような筆算で割り算の結果と余りの値を書き、最後に下からあまりの値を拾っていくような方法が知られています。

8進数→10進数

8進数→10進数も2進数と同じ手順で変換できます。詳細な解説は省きますが、例えば8進数2475を10進数に変換すると以下のようになります。

10進数→8進数

10進数→8進数の変換も重み表を用いて、2進数の時と同じように計算します。ただし数が大きくなっているため計算が面倒です。変換する機会は2進数ほど多くありませんが、2進数以外の変換も出題されることがあるため方法を把握しておきましょう。

10進数→8進数(別解)

別解による方法も2進数と同じように変換できます。割るときの値が8進数の基数である8になりますが、あまりを拾っていくところは同様です。

2進数⇔16進数

2進数→16進数、16進数→2進数の変換も同じようにできます。ここでは解説を省きます。

r進数⇔2進数の相互変換

r進数⇔2進数の相互変換は10進数のほかは8進数、16進数ができるようになっているとよいです。特に16進数は重要です。といっても2進数⇔10進数との相互変換が分かっていれば難しくはありません。

2進数→8進数

2進数10011を8進数にしてみます。

① 2進数を3桁ずつ分ける

② 分けたそれぞれのブロックを8進数に直して結合すると8進数になる
2進数⇔10進数の変換が身についていると変換は容易です。よくわからない場合は2進数⇔10進数変換を良く練習しましょう。
2進数10011を8進数にすると23になります。

8進数→2進数

2進数→8進数と逆のことをすればいいので詳細は省きます。8進数23を2進数010011に直してみましょう。

2進数→16進数

2進数10101000を16進数にしてみます。

① 2進数を4桁ずつ分ける
8進数では3桁ずつですが、16進数では4桁ずつです。今回の例では関係ないですが、上の桁が足りない場合その桁を0とみなすのは8進数と同様です。

② 分けたそれぞれのブロックを16進数に直して結合すると16進数になる
2進数⇔10進数の変換が身についていると変換は容易です。よくわからない場合は2進数⇔10進数変換を良く練習しましょう。
2進数10101000を16進数にするとA8になります。

例えば、16進数のA8を変換したい場合、Aと8に分解し、それぞれ10進数変換を経て2進数に変換します。その後それをつなげると全体の2進数に変換できます。

16進数→2進数

2進数→16進数と逆のことをすればいいので詳細は省きます。8進数A8を2進数10101000に直してみましょう。

なぜ8進数は3桁ずつ、16進数は4桁ずつなのか
8進数が3桁ずつなのは8が2の3乗、16進数が4桁ずつなのは16が2の4乗であるからです。しかし、数学が苦手な人にとってはそういわれても難しいかと思いますので、まずはそういうものだと覚えこむことから始めて徐々に数字の感覚に慣れていきましょう。

2進数1010の読み方は?
普段と同じく「せんじゅう」と読んでしまうと誤りで、通常は「いちぜろいちぜろ」と読みます。重みのところで学びましたが、桁は「重み」を表します。10進数の1010を「せんじゅう」と読むのは、「1000(せん)の桁が1つと10(じゅう)の桁が1つ」のという意味ですが、2進数になると重みは「8の桁が1つと2の桁が1つ」という意味となるので、「せん」「じゅう」と読むのは正確性を欠くことになります。
同様に、8進数23は「にじゅうさん」と読んでしまうと10進数の読み方となってしまうため「にいさん」のように読むのが正しく、これは16進数にも同じことが言えます。

ある数値について、10進数なのか2進数なのかという見分け
例えば単に「10」とあった場合、これは10進数なのか2進数なのかわからないです。この章では「10進数の」などと頭に付けて書いてきましたが、10(10)のように、後に括弧書きで基数を示す方法もあります。ただし、基数が明白な場合は省略することも多いです。
プログラムの世界においては先頭に0が付くと8進数、0xが付くと16進数とみなすという決まりがあることもあります(先頭が0が8進数はかなり罠ですが、情報処理試験においてはこのルールはあまり使われないため気にしなくてもよいです)。

過去問演習

基数は情報処理試験においては基本中の基本なので、応用情報技術者試験においては応用的な難しい問題が出題される傾向にあります。これらの問題が答えを見てもわからない場合は基本情報やITパスポートの問題を解いてみることをお勧めします。

0以上255以下の整数nに対して,

と定義する。next(n)と等しい式はどれか。ここで,x AND y 及び x OR y は,それぞれxとyを2進数表現にして,桁ごとの論理積及び論理和をとったものとする。

ア.(n+1) AND 255
イ.(n+1) AND 256
ウ.(n+1) OR 255
エ.(n+1) OR 256

解答:ア

2進数の応用問題です。過去何回も出題されている定番の問題なので、答えるようになっておきたいです。
式は「nが0以上255未満の時n+1になり、nが255の時は0になる」という意味です。例えば、nが254だった場合は計算結果が255になり、nが255だった場合は計算結果が0になります。

これが成り立つものを、ア~エの選択肢一つ一つに対して計算を行ってみることで解答を導きます。

【出題歴】

  • 令和5年春期 問1
  • 平成31年春期 問1
  • 平成27年秋期 問1
  • 平成22年春期 問1
タイトルとURLをコピーしました