n進数という名前が出てくると「うっ頭が…」ってなる人のn進数講座（3）〜2進数の掛け算、割り算について〜

基本情報技術を学んだ事がある人、学んでいる最中の人がいずれも悩んだ事があるだろうn進数の計算。
自分もその一人でした…。ですが、その状態から脱却すべく必死になって勉強した結果ある程度はわかる様になったので自分なりにわかりやすく解釈したものをここに残そうと思います。

今回は第３段ということで…。前回の記事は以下の通りになります。

[n進数という名前が出てくると「うっ頭が…」ってなる人のn進数講座（1）〜n進数の基本変換について〜](https://qiita.com/waka-ken/items/5658706c43303297784f)

[n進数という名前が出てくると「うっ頭が…」ってなる人のn進数講座（2）〜2進数の足し算、引き算について〜](https://qiita.com/waka-ken/items/7e4b327cf1b368b541cc)


今回n進数を使った掛け算、割り算を説明していくのですが、結構厄介な内容になりますので、できるだけ簡単に説明する努力はしますが、「やっぱりわからん！」ってなったらごめんなさい…。


#■シフト演算


シフト演算とはn進数で表記された数字の桁を左右にずらすことです。
左右の数字をずらすことで掛け算、割り算を行うことができます。

例）２進数１１１０（１４）の場合、

左に１シフトさせると・・・

|  | 1 |1 | 0 | 0 |(12)|
|:-:|:-:|:-:|:-:|:-:|:-:|
| ↙︎ | ↙︎ | ↙︎ | ↙︎  |　 | |
| 1 | 1 | 1 |  0 | 0 |(28) |

答え**１１１００（２８）**

これ１シフトした場合２倍されてます。もし２シフトさせた場合は４倍、３シフトさせた場合８倍となります。

では逆に右にシフトさせた場合はどうなるだろうか

| 1 |1 | 0 | 0 |(12) |
|:-:|:-:|:-:|:-:|:-:|
|  | ↘︎ | ↘︎  |↘︎ |  |
|  | 1 |  1 | 0 | (6) |

答え**１１０（６）**

どうだろう…。察しの言い方はもしかしてと思うかもしれないが、つまりこういう法則が成り立つわけです。

「**左にnシフトさせると、シフト前の数2^n倍**」

「**右にnシフトさせると、シフト前の数1/2^n倍**」



##【論理シフトと算術シフト】

また、シフト演算には二つ方法があり、それが「**論理シフト**」と「**算術シフト**」です。

え？二つもあんの？ってなるかと思いますが、この二つ差はほとんどありません。

違いは以下の通り、

論理シフト・・・符号（＋とかー）を**考慮しない**方法

算術シフト・・・符号（＋とかー）を**考慮する**方法

これだけ。

複雑に考えても仕方ないのでいろんな説明省くと、とりあえず「**算術シフト**」だけ覚えておけばいいってことです。

ってことで論理シフトについては詳しくは解説しませ〜ん


##【算術シフトの計算方法】

先ほど説明した通り符号を考慮する方法ですが、前の記事にも説明した通り符号はビットの先頭数字を使って判断しています。

例）−２８を表記する場合

| 1 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| ↓ | ↓  | ↓  | ↓  | ↓  | ↓| ↓|↓ |
| -  | 1  | 1  | 0  | 1  |1   | 1  | 1  |
| -  |   |   |   |   |   | ２  |  ８ |

では算術シフトの説明をするわけですが、やり方は先ほど説明した通り基本的には左右にシフトさせていくだけです。
ですが算術シフトには以下のルールがあります。

**・シフトさせた時にはみ出た数字がある場合はその数を取り除く**
**・シフトさせた時に開いた隙間には０または１を入力する（←０か１を入れるルールは後述する※）**

例）-２８を算術シフトさせる場合

| 元の数  |   | 1 | 1 | 0 | 0| 0 | 1 | 0 | 0 |  |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|   |  ↙︎ | ↙︎  | ↙︎  | ↙︎  | ↙︎  | ↙︎  | ↙︎  | ↙︎  | ↙︎ |  |
| 左シフト（２^n） |(1)| 1 | 0 | 0| 0 | 1 | 0 | 0 | 0 |
|   |   |   |  ↘︎ | ↘︎  | ↘︎  | ↘︎  | ↘︎  | ↘︎  | ↘︎ | ↘︎ |
| 右シフト（1/２^n）  |   | 1 | 1 | 1 | 0 | 0| 0 | 1 | 0 | (0) |

【★ポイント】
①（）で囲んだ部分がシフトさせた時に取り除かれた数字で本来ならば書かない
②シフトした時に８ビット内で空白が出た部分には０または１を補填している

**※数字を補填する際のルール**
空白ができた時に補填するルールは以下のルールがある

**左シフトでできた(右側にできる）空白・・・０を補填**
**右シフトでできた(左側にできる）空白・・・符号と同じ数字（０または１）を補填する**


#■掛け算・割り算

ここまで長々とシフト演算の方法を説明してきましたが、ここでようやく掛け算、割り算のやり方を説明していきます。

冒頭で説明した内容を覚えていますでしょうか？
２進数では以下のルールがあったかと思います。

**左側にシフトする＝2^n  （+nシフトするごとに2^n)**
**右側にシフトする＝1/2^n （-nシフトする毎に1/2^n）**

つまりここで何が言いたいのかというと

**２進数における掛け算、割り算は全て2^nを使って行うことができる**のです

##【掛け算】

掛け算についてですが、例を元に説明すると

例）
２　x　８ 
＝　２　x　（２^3）　
＝　１６

２　x　１５　
＝　２　x　（2^3　＋　2^2　＋　2^1　＋　2^1）　
＝　３０

このように数字を2^n同士の足し算に置き換えることによって簡単に表すことができます。。

##【割り算】

対して割り算ですがこれも実は簡単です。

小学校の時に学んだ割り算を筆算するやり方を用います。

例）
１５　÷　３
＝１１１１　÷　１１
＝？

|  |  |  |  |1  | 0 |  1 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|  1 | 1  | )  | 1  |1   | 1  | 1  |
|   |   |   | 1  | 1  |   |   |
|   |   |   |   |   |  1 |   |
|   |   |   |   |   |  0 |   |
|   |   |   |   |   |  1 |  1 |
|   |   |   |   |   |  1 |  1 |
|   |   |   |   |   |   |  0 |

つまり答えは**１０１（５）**となるわけです。

実はこれ算術シフトを行って計算していることにお気づきでしょうか？

１１（３）を順に算術シフトしていき（１１００、１１０、１１）
それぞれの数字で１１１１（１５）から引き算しているだけなのです。

#■次回は…

ここまで読んでくださりありがとうございます。

とりあえず一つ目のタイトルはこれにて終了です。
n進数について少しでも理解がしやすくなれば幸いです。

次回は別のタイトルにて書かせていただく形になるかと思います。
とても個人的なアウトプットとして書かせていただいているので少し場違いかんが否めませんが、今後も継続していきたいと思います

ではまた次の記事にて！！