N進数とその計算についてのまとめ

## N進数
- N進数でよく使われるやつは以下の4つ
    - 2進数
    - 8進数
    - 10進数
    - 16進数


### 2進数
2進数の桁上りは10進数の数が2のn乗のときに発生する。

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

### 8進数
8進数の桁上りは10進数の数が8のn乗のときに発生する。
| 10進数 | 8進数 |
|:-:|:-:|
| 0 | 0 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
| 7 | 7 |
| 8 | 10 |
| 9 | 11 |
| 10 | 12 |
| 11 | 13 |
| 12 | 14 |
| 13 | 15 |
| 14 | 16 |
| 15 | 17 |
| 16 | 20 |
| ... | ... |
| 64 | 100 |

### 16進数
16進数の桁上りは10進数の数が16のn乗のときに発生する。
| 10進数 | 8進数 |
|:-:|:-:|
| 0 | 0 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
| 7 | 7 |
| 8 | 8 |
| 9 | 9 |
| 10 | a |
| 11 | b |
| 12 | c |
| 13 | d |
| 14 | e |
| 15 | f |
| 16 | 10 |
| 17 | 11 |
| ... | ... |
| 256 | 100 |

## 基数変換
ある基数で表した数値を別の数値に置き換えることを基数変換と言う。
基本情報技術者試験の問題で出題されるため、基数変換の方法を抑えておく必要がある。

基数変換するのに便利なサイト
https://tools.m-bsys.com/calculators/radix_convertor.php


## 10進数をN進数にしたい場合
１０進数の値をNで割った余りを利用する。
以下は10進数の123を16進数に変換する例
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353901/59fe34f3-dda3-803c-020a-d92991ba1c08.jpeg)


## N進数を10進数に変換する場合
この場合は桁の重みを利用する。
N進数の桁の重みは以下の通り

| 桁数 | 桁の重み |
|:-:|:-:|
|  1 |  Nの０乗 |
|  2 |  Nの１乗 |
|  3 |  Nの２乗 |
|  4 |  Nの3乗 |
|  ... |  ... |
|  N |  NのN-1乗 |

2進数であれば、１桁目の重みは1、2桁目は2、3桁目は4、４桁目は8のようになる。

１６進数を桁の重みを利用して10進数に変換すると以下のようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353901/462726b1-95a2-39dc-5785-a0bf8b1fc6c1.png)








## 2進数の計算
コンピュータの計算は足し算しかできない。
しかし普段使用しているパソコンは足し算だけでなく引き算も掛け算、割り算ができる。
つまりコンピュータは足し算のみを駆使して引き算、掛け算、割り算を行っている。

### 足し算
0001と0110を足し算した場合は以下のような計算をする。

10進数の計算を2進数として行うだけなのでシンプル。
よって答えは1001。

### 引き算
10進数でも
5+(-2)=3
のような形で足し算で引き算が可能。
同じように2進数の先頭を符号にしてみる。

例：
```
0011は3
1011は-3
```


0011+1011=1110
0000になって欲しいのにならない。

そこで補数というものが登場する。
#### 2の補数
2の補数が何かについての説明は省略。
0011のビットを反転する。
すると1100になる。
1100に0001を加算して1101にすると0011の2の補数になる。
![image 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353901/e65e8295-adfc-5855-0a16-e97245eb0223.png)


0011+1101=10000
4ビットの計算なので、先頭の5ビット目を切り捨てると0000になる。
2の補数を利用してマイナスの数を2進数で表すことができる。

| 10進数 | 2進数 |
|:-:|:-:|
| 3 | 0011 |
| 2 | 0010 |
| 1 | 0001 |
| 0 | 0000 |
| -1 | 1111 |
| -2 | 1110 |
| -3 | 1101 |


### 掛け算と割り算
2進数で掛け算と割り算をするにはシフト演算を理解する必要がある。
#### シフト演算とは？
シフト演算とは、2進数のビット列を右または左にずらす演算のこと。

10進数で例えると330という数があったとき
- **3300と左に桁をずらすと10倍になる。**
- **33と右に桁をずらすと1/10倍になる。**

以上の内容は2進数でも同じ。
0110(6)の2進数があったとき
- **1100と左に桁をずらすと2倍(12)になる。**
- **0011と右に桁をずらすと1/2倍(3)になる。**

つまり左にn桁ずらすと2のn乗倍になり、右にn桁ずらすと1/2のn乗倍になる。

#### 符号を考慮するシフト演算(算術シフト)
符号を考慮して行うシフト演算を算術シフトと呼ぶ。
先頭のビット数を固定する。

例：左シフトの場合
![image 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353901/ee9436b8-e400-addc-f25c-1afae3ed870b.png)


例：右シフトの場合
![image 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353901/9b39ee32-1c4f-d1fc-d8ad-eb5bdc594014.png)


#### 3倍や5倍を計算するときは？
2の倍数ではないときでも工夫すればシフト演算で対応できる。

##### 掛け算をしたいとき
*倍にしたい数値を2のn乗に置き換えて足し算をする。*

例：
8×5をする場合
![image 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353901/f656e63d-b809-6515-e201-15918304324a.png)


##### 割り算をしたいとき
*割りたい数字を割る数字で何回引くことができるかを考える。*
これは文字で説明するより実際に見たほうがわかりやすいと思う。

例：
15÷4をする場合
![image 7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353901/ac395bcd-e9b2-1bc6-3bc9-c8686e030252.png)