[基本情報技術者]n進数について

# はじめに
基本情報技術者を勉強しているのでn進数について書いていきます。

コンピューターは0と1を高速に処理することで複雑な内容を表現しています。
なのでコンピューターは数字やデータなどを2進数で扱っています。また、コンピューターが扱えるデータの最小単位をbit(ビット)と言います。

# 目次
1. n進数とは
2. n進数の数値の表し方
3. よく使われる2進数、8進数、16進数
4. 基数と重み
5. 基数変換

# 1. n進数とは
n進数とはn個の数字を使って数を表しています。例えば、2進数の場合0と1で2個の数字を使って数をあわらします。
普段私たちは0~9の10個の数字を使って数を表しているので10進数です。

# 2. n進数の数値の表し方
### 8進数の場合
**0→1→2→3→4→5→6→7→10→11~~16→17→20→21→22...**
### 16進数の場合
**0→1→2→3→4→5→6→7→8→9→A→B→C→D→E→F→10→11~~19→1A→1B→1C→1D→1E→1F→20→21→22~FE→FF→100...**

16真数は6つのアルファベットを用います。

# 3. よく使われる2進数、8進数、16進数
8進数と16進数は2進数と相性が良いためよく使われます。
それは8進数は1つの桁で'0~7'の数値を表現できます。
これを2進数にすると'0~111'となり同じ範囲を表しています。
なので**8進数は2進数3桁分**の情報を表現することができるといえます。

16真数も同様に、1つの桁で'0~15'(本来はアルファベット)を表現でき、2進数にすると'0~1111'となります。なので**16進数は2進数4桁分**の情報を表現できます。

また、2進数の一桁は1bitであるので、**8進数は3bit**、**16進数は4bit**の情報を一桁で表現できます。

# 4. 基数と重み
### 基数
基数とは「基本となる数」のことであり、n進数のnにあたる数字が基数です。
### 重み
10進数の場合、1, 10, 100, 1000…と桁が上がるごとに10倍されていきます。
2進数の場合は、1, 2, 4, 8…と桁が上がるごとに2倍されていきます。
これを桁の重みと言います。
n進数が持つ各桁の重みは次のように表すことができます。
 
&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;←整数部分&emsp;&emsp;&emsp;&emsp;&emsp;小数部分→


| ... | n^2 | n^1 | n^0 | 小数点<br>. | n^-1 | n^-2 | n^-3 | ... |
|-----|-----|-----|-----|:---:|------|------|------|-----|

### 例. 2進数
| ... | 8 | 4 | 2 | 1 | . | 1/2 | 1/4 | 1/8 | ... |
|-----|-----|-----|-----|:---:|------|------|------|-----|----|

# 5. 基数変換
ある基数で表した数値を、別の基数表現に置き換えることを基数変換と言います。
### n進数から10進数への基数変換
各桁の数字にその桁の重みを掛け算することで10進数表記における値を求めることができます。
例えば、2進数の「1010.111」を10進数に変換する場合以下の方法で求めることができます。

| 2進数 | 1 | 0 | 1 | 0 | . | 1 | 1 | 1 | 
|------|:----:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| 掛け算 | × | × | × | × || × | × | × |
| 各桁の重み | 8 | 4 | 2 | 1 || 1/2 | 1/4 | 1/8 |
|| ↓ | ↓ | ↓ | ↓ || ↓ | ↓ | ↓ |
|| 8 | 0 | 2 | 0 || 0.5 | 0.25 | 0.125 |
一番下の段を全て足すと
8+0+2+0+0.5+0.25+0.125=10.875
となる。
よって、10進数に変換した数値は10.875となります。

### 10進数からn進数への基数変換
#### 重みを使う方法
先ほどの「10.875」という10進数を2進数に変換して行きます。
桁の重みで割り算をすることで求めることができます。
商を書いて行き余りがなくなるまで繰り返します。

||10.875| 2.875| 2.875| 0.875|0.875| 0.375| 0.125|
|:------:|:----:|:------:|:-------:|:------:|:-----:|:-------:|:---:|
||÷ |÷| ÷| ÷| ÷| ÷| ÷|
|各桁の重み| 8|4 | 2| 1| 1/2 | 1/4|1/8|
|2進数|1|0| 1| 0 |.|1 | 1| 1|

最後に並べた数字(1010.11)が2進数で表した時の数値となります。

#### 割り算と掛け算を使う方法
こちらの方法は「整数の部分は割り算」「小数の部分は掛け算」を行い変換する方法です。
「10.875」という10進数を2進数へ変換して行きます。
**整数部分:10**

||余り|
|:---:|:---:|
|10÷2=5 | 0|
|5÷2=2 | 1|
|2÷2=1 | 0|
|1÷2=0 | 1|

商が0になるまで繰り返します。

**小数部分:0.875**

2×0.875=1.75
2×0.75=1.5
2×0.5=1

小数部分が0になるまで繰り返します。
これらの結果を**「整数部分は余りを下から」**、**「小数部分は積の整数部分を上から」**並べると基数変換後の数値を表すことができます。

よって、1010.111となります。

### 2進数、8進数、16進数間の基数変換
**3.**で書いたように8進数は2^3だから2進数3桁で、16進数は2^4だから2進数4桁で表すことができます。
なので2進数を8進数に変換する場合は、2進数を3桁ごとに区切ります。

#### 2進数「1100.11」の時
#### 8進数に変換

|001  |  100  |.|  110|
|---|----|----|-----|

**足りない部分は0で補います。**
区切ったものをそれぞれ10進数に変換します。

001→(0×4)+(0×2)+(1×1)=1
100→(1×4)+(0×2)+(0×1)=4
110→(1×4)+(1×2)+(0×1)=6

よって、8進数に変換すると14.6となります。

#### 16進数に変換

|1100   |.|  1100|
|-----|----|------|

**足りない部分は0で補います。**
区切ったものをそれぞれ10進数に変換します。

1100→(1×8)+(1×4)+(0×2)+(0×1)=C
1100→(1×8)+(1×4)+(0×2)+(0×1)=C

よって、16進数に変換するとC.Cとなります。

### 8進数、16真数から2進数に変換する場合
#### 8進数が13.2の時
各桁を2進数3桁にばらします。

001  |  011  | . |  010

両端の0を取り除きます。
よって、1011.01となります

#### 16進数がC.8の時
各桁を2進数4桁にばらします。

1100  | . |  1000

両端の0取り除きます。
よって、1100.1となります。