10進数→2進数の基数変換の計算の仕組み(整数部)

# はじめに
ITパスポートや基本情報などでよく出てくる10進数を2進数に変換する計算ですが、参考書などで以下のような計算方法を叩き込まれるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292417/df7b69b3-ef73-8ea6-619c-d6c6a6451810.png)

しかしどの参考書も計算方法は教えてくれているものの、
なぜこの方法で変換ができるかという点については説明がない...

ただ仕組みがわからないとすぐに頭から抜けてしまいます(実際私は忘れまくっています)

ということで、今回はなぜ上記の方法で基数変換ができるかについて考えた結果を書いていこうと思います。

尚、私自身も数学に詳しい訳ではないので特に難しい数学の前提知識は不要です。

# 設問
- ハートの図形が9個存在する、この図形の総数を２進数の値に変換しなさい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292417/1de20699-667b-5ddf-b296-620d190b9def.png)


一般的な設問だと、「10進数9の値を2進数で表せ」のような書き方になると思われますが、仕組みを理解するためにはまずひとつ一つの単位を具体的な物質に落とし込むことが重要です。
図形の形は何でもいいのですが、今回はハートにします(~~ハートが一列に並ぶとまるでゼルダの伝説みたいですね！~~)

## 1桁目の値を求める
それでは、総数に対して基数で割っていきます。
今回ハートが計9個あるので、総数は９です。
2進数に変換するため、基数は2です。
つまり9を2で割ります。

| 総数 | 基数 | 解      | 
| :--: | :--: | :-----: | 
| 9    | 2    | 4 余り1 | 

これを図形で表すと以下になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292417/0ff4d2be-9ad8-2392-b3f9-623b782c32c5.png)

各ハートが2つ１組となって色塗りされてます。
商の4という値はこの**纏まりの数**を表しています。
今回の場合だと
- 赤組
- 黄組
- 緑組
- 青組
合計4つの纏まりができています。

一方余り1は組になれなかった値です。
今回1つのハートが2つ1組になれませんでした(黒色のハート)

## 2桁目の値を求める
2桁目の値を求めるわけですが、
一般的な教えだと先に計算した商の値を「割られる数」として、
基数で割ることになります。
これを今回のケースに沿った形で説明すると、
「組を1単位として組の総数を基数で割る」といった説明になります。

先述の通り、組は4つありました。
そのため、計算式は``4 ÷ 2``となります。

| 総数(組) | 基数 | 解 |
| :-: | :-: | :-: |
| 4 | 2 | 2 余り0 |

これを図形で表すと以下になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292417/0ab98215-8b06-d453-e4cc-5755c2f0c608.png)

それぞれのグループには2つのハートの組が含まれてますね。
今回は外れ物がなく、綺麗に仕分けできました。
そのため、余り0となります。
また商の2はグループが2つできたことを意味します。

## 3桁目の値を求める
 3桁目は「グループを1単位としてグループの総数を基数で割る」
 言い換えるとグループを2つ1組にする。
 前回の計算結果からグループは2つできてますね。

なので計算式は``2 ÷ 2``となります。
| 総数(グループ) | 基数 | 解 |
| :-: | :-: | :-: |
| 2 | 2 | 1 余り0 |

図形にすると以下となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292417/c56f02cd-f2bf-a12a-be56-26d2d927e995.png)

グループを2つ含むクラスターが1つできました。

## 4桁目の値を求める
4桁目は「クラスターを1単位としてクラスターの総数を基数で割る」
言い換えるとクラスターを2つ1組にする。
ですが、前回の計算結果からクラスターは1つしかありません。
これでは基数である2で割ることができないため、
結果は以下のようになります。

| 総数(クラスター) | 基数 | 解 |
| :-: | :-: | :-: |
| 1 | 2 | 0 余り1 |

余談ですが、クラスターを2つ1組にするには、
クラスターが2つ以上必要となります。
1つのクラスターには8個のハートが含まれてますから、
16個以上のハートが存在していないと、これより上のステージには進めないということですね。

## 解答
先の計算結果を並べると
``1001``という値が求められれます。
つまり10進数の9を2進数で表すと``1001``となります。

## 解説
これまで「組」「グループ」「クラスター」というような使い分けをしてきました。
これは説明をするためのあくまで便宜的に表現している物です。
そしてその対応関係は以下のようになります。

| 単位 | 含まれるハートの数 | 桁 |
| :-: | :-: | :-: |
|ハート|1|1桁目|
| 組 | 2 | 2桁目 |
| グループ | 4 | 3桁目 |
| クラスター | 8 | 4桁目 |

設問の内容を振り返りましょう。
> ハートの図形が9個存在する、この図形の総数を２進数の値に変換しなさい

注目すべき所は「この図形の総数を２進数の値に変換しなさい」という所です。
「この図形」とはハートの図形です。
つまり、本質はハートの図形がいくつあるのかであり、
それぞれの単位にいくつのハートが含まれているのかを意識する必要があります。

## 商とは纏まりの単位
商は割り算の結果を意味しますが、そもそも割り算とは何でしょうか？
そこでまず割り算の基本的な考え方から触れます。
``6 ÷ 2``という計算式があったとします。
これを文章で表現すると、
「6という値の中に2がいくつ含まれているか」と言い換えることができます。
2を1単位として、２が何個含まれているのかを算出しているのです。
6の中に2は3つ含まれていますから答えは``3``となります。

では2進数の変換に話を戻します。
これまで基数で除算していきました。
除算する度に2つ1組となる纏まりが生成されていきました。
この纏まりは1つ前の単位のものを2つ合わせた値となるため、
前の単位同士を2つ足した値となります。
- 組：ハートを2つ足したもの　= 2
- グループ：組を2つ足したもの = 4
- クラスター：グループを2つ足したもの = 8
重要な観点としては、単位が変わるごとに含まれるハートの数が変わっているということです。
そしてこの増え方ですが2のn乗と同じですね。

この纏まりは割り算の「**商**」として求められます。


## 余りは次の単位へ纏められなかった値
「纏まりは前の単位のものを2つ合わせた値」と説明しましたが、
いつも綺麗に纏まる訳ではありません。

つまり纏めきれず残った値が「**余り**」です。
先の説明で「単位が変わるごとに含まれるハートの数が変わっている」と言いました。
つまり、同じ「余り1」でもその余りに含まれるハートの数は異なっているということです。
なので、割られる数に含まれるハートの数が幾つなのかを理解しておく必要があります。

例えば「組」を「グループ」に変換するため2で除算した場合に余りが発生したとします。
この時は「組」はハートを2つ有していますので、この位置で「余り1」となれば、
10進数の2に相当する値が存在するということになります。
２進数において、``2``を表す桁は2桁目になりますね。
なので2桁目に1が入るのです。
そして単位に含まれるハートの数は2のn乗で増加していきますから、
余りの有無とそれが発生した位置を理解することで、10進数を2進数に変換可能というのがこの計算の仕組みです。


# 終わり
あまり上手に説明できなかった気がしますが以上となります。
今回は2進数のお話でしたが、8進数や16進数でも基本的な考え方は同じなはずです。
なぜ余りを求めていくことで2進数に変換できるのかという仕組みの理解に少しでもお力になれたら幸いです。