基本情報技術者　N進数の計算

### この記事の目的
基本情報技術者試験対策で学んだことをアウトプットとしてまとめていきます。

### 10進数とは
私たちの現実世界では主に10進数が使われています。言葉は難しく言っていますがとても簡単です。
10進数とは0〜9までの数字で数を数えます。
9の次は桁が繰り上がり10となりますね。
これは10という数字ですが分解すると1と0になるので結局0〜9までの数字を使っていますね。

### コンピューターは2進数？
ではコンピューターの世界ではどうかというとコンピューターは2進数を使います。
なぜかというとコンピューターは電気で動いているため、ONとOFFの2種類しか判断できないためです。
私たち人間は0〜9までの10個の数字に慣れているのですが、コンピューターにとっては0と1の2個の数字しか持ってないのですね。

それでは0と1でどうやって数字を表すのでしょうか？

### 0と1だけで数字を表す方法

ここで2進数と10進数を比べてみましょう。

| 2進数 | 10進数 |   
|-----:|------:|
| 0    | 0     |   
| 1    | 1     |       
| 10   | 2     |      
| 11   | 3     | 
| 100  | 4     |
| 101  | 5     |
| 110  | 6     |
| 111  | 7     |
| 1000 | 8     |
| 1001 | 9     |
| 1010 | 10    |
| ...  | ...   |

このようになります。2進数は0,1までは10進数と同じですが、10進数で言うところの2は使えないので、1の次は10になります。
ちなみにこれは**じゅう**ではなく**いちぜろ**と呼びます。
10(いちぜろ)の次は11(いちいち)、その次は桁上がりして100(いちぜろぜろ)といった具合になります。

### N進数から10進数への変換

ここからが本題になります。N進数(Nは任意の値)から私たちが普段使う10進数への変換をやってみましょう。
今回は2進数から10進数の変換をやってみたいと思います。

2進数を10進数に変換するには各桁の重み(基数)を使います。

### 重み(基数)とは

桁の重み(基数)とはなんでしょうか？
10進数で考えてみましょう。
例えば、86という数字があったとしましょう。(私の学生時代の背番号です笑。これはなんでも構いません。)
86という数字を分解すると8×10+6×1となると思います。これは10の位が8で1の位が6ですね。
私たちは10進数に慣れているので意識せずともこういった計算ができますが、この時の10というのが桁の重み(基数)になります。

簡単に考えるとN進数のNの部分が重み(基数)になるということです。
先ほどの86という数字をもっと細かくみていくと

|10の1乗|10の0乗|
|------|-------|
| 8    | 6     |
となります。
10の1乗は10ですから10×8
10の0乗は1ですから1×6(0乗は1になる)
それらを足して86になるわけです。
桁が増えれば基数である10の2乗、3乗と増やしていけば計算できるわけです。

これを2進数に置き換えてみましょう。
2進数の100(いちぜろぜろ)は10進数で表すと4でしたね。そして2進数の桁の重み(基数)は2でした。
100を分解すると

|2の2乗|2の1乗|2の0乗  |
|-----|------|-------|
|1    | 0    | 0     |
となります。

あとはこれを計算するだけです。
2の2乗は4ですので4×1+2×0+1×0で答えは4になります。
これで2進数から10進数への変換ができました。
慣れてしまえばどうってことないですね！

ちょっと応用編で小数も入れてみましょう。

|2の2乗|2の1乗|2の0乗  |小数点|2の-1乗|
|-----|------|-------|-----|------|
|1    | 0    | 0     |.    | 1    |

100.1という2進数を10進数に直してみましょう。
やり方は一緒ですが、小数点以下は乗数がマイナスになる点に注意しましょう。
2の-1乗は0.5になります。
したがって10進数だと4.5になりますね。


### 10進数からN進数への変換

今度は反対に10進数からN進数への変換をやってみましょう。
これには2種類やり方があるのですが、どちらを使っても構いません。やりやすい方で覚えましょう。

それではさきほどと逆で10進数の4.5を2進数にしてみましょう。

まず1つ目のパターン
先ほどの基数を使った変換の逆パターンです。

```
4.5という数字を2のN乗で表せる最大値で割っていきます。
4.5に対して2のN乗の最大値は2の2乗である4ですから4で割ります。
4.5 ÷ 4 = 1あまり0.5です。
次は0.5を2のN乗で表せる最大値で割ります。
2の1乗では割れないので0ですね。
2の0乗でも割れないので0です。
2の-1乗(1/2)で割れそうなので割ると1あまり0になります。
```

計算式は

```
4.5 ÷ 4   = 1あまり0.5
0.5 ÷ 2   = 0あまり0.5
0.5 ÷ 1   = 0あまり0.5
0.5 ÷ 0.5 = 1あまり0 ←あまりが0になったので終了。
```

小数点以下は **.**で区切ります。そして割り算の答え(商)を上から読むと

100.1
となり先ほどの2進数と同じになりましたね！

------------------------------------------



2つ目のパターンは
整数部分は割り算、小数部分は掛け算のやり方です。こちらも言葉だけではわかりづらいので実際にやっていきます。
ただ、今回は4.5だとこのパターンの特徴がわかりづらいので13.375という少し桁が大きい物を扱うことにします。

13.375を整数部分と少数部分に分けます。13と0.375ですね。
まずは整数部分の13を2進数の基数2で割っていきます。

```
13 ÷ 2 = 6あまり1
6  ÷ 2 = 3あまり0
3  ÷ 2 = 1あまり1 ←商が2未満なので終了
```
この時の最後の商(今回の場合1)と余りを下から読むのがポイントです。下から読むと1101になります。

次に小数部分に基数を**かけて**いきます。

```
0.375 × 2 = 0.75
0.75  × 2 = 1.5　←この時小数点以下(今回の場合0.5)を次の計算式に持ってくる
0.5   × 2 = 1.0 小数点以下が0になったので終了。
```
この計算結果の1の位を上から読んで011となります。
2つの計算結果を組み合わせると1101.011になりますね。

整数部分は割り算、下から読む。小数部分は掛け算、上から読む。とちょっと複雑ですが、これも何度か問題を解く内に慣れると思います。

以上2つの変換方法がありました。
どちらが自分に向いているのか両方試してみてください！

### さらに応用　2進数から8進数、16進数への簡単な変換方法

2進数から8進数、16進数へは簡単な変換方法があります。
8は2の3乗、16は2の４乗というところから8進数は2進数の3つぶん、16進数は2進数の4つぶんを表せます。
どういうことかというと

8進数は1つの桁で0から7までを表せます。これは2進数で言うと0から111までの3桁分を表せることを意味します。
16進数は1つの桁で0から15までを表せます。これは2進数で言うと0から1111までの4桁分を表せることを意味します。
16進数とは9の次がAになります。0〜Fまでを使い数字を表します。
(0〜9、ABCDEFの16種類の数字を使う)

ということで応用に入りますが、1101.011を8進数に直すには3桁ずつに区切って計算します。

```
①1101.011を3桁ずつ区切る
1 101 011
②足りないところには0を入れる
001 101 011
③各桁に、桁に合った基数の乗数をかける(今回の場合2の2乗,2の1乗,2の0乗)

001 → 0×4         101 → 1×4        011 → 0×4 
      0×2               0×2              1×2
      1×1               1×1              1×1
    =  1              =  5             =  3

答え 15.3

```


16進数の場合は4桁ずつ区切ります。

```
①1101.011を4桁ずつ区切る
1101 011
②足りないところには0を入れる
1101 0110
③各桁に基数をかける
④10進数から１６進数に変換する。

1101 → 1×8         　　　0110 → 0×8 
       1×4                     1×4
       0×2                     1×2
       1×1                     0×1
    =  13(これは10進数)         =  6
        ↓16進数に直す
    =   D
答え D.6

```
となります。
こちらは少し複雑なので慣れてきたら使ってみると良いでしょう。

### 最後に

数学が苦手な自分のような方にとってはなかなか最初はとっつきにくいですが、慣れてくるとスッとわかるようになるので問題をたくさん解いたり、自分で数字を当てはめてみたりしてすぐ計算できるようにしていきましょう！

### 参考

キタミ式イラストIT塾基本情報技術者