基本情報技術を学んだ事がある人、学んでいる最中の人がいずれも悩んだ事があるだろうn進数の計算。
自分もその一人でした…。ですが、その状態から脱却すべく必死になって勉強した結果ある程度はわかる様になったので自分なりにわかりやすく解釈したものをここに残そうと思います。
今回は第3段ということで…。前回の記事は以下の通りになります。
n進数という名前が出てくると「うっ頭が…」ってなる人のn進数講座(1)〜n進数の基本変換について〜
n進数という名前が出てくると「うっ頭が…」ってなる人のn進数講座(2)〜2進数の足し算、引き算について〜
今回n進数を使った掛け算、割り算を説明していくのですが、結構厄介な内容になりますので、できるだけ簡単に説明する努力はしますが、「やっぱりわからん!」ってなったらごめんなさい…。
#■シフト演算
シフト演算とはn進数で表記された数字の桁を左右にずらすことです。
左右の数字をずらすことで掛け算、割り算を行うことができます。
例)2進数1110(14)の場合、
左に1シフトさせると・・・
1 | 1 | 0 | 0 | (12) | |
---|---|---|---|---|---|
↙︎ | ↙︎ | ↙︎ | ↙︎ | ||
1 | 1 | 1 | 0 | 0 | (28) |
答え11100(28)
これ1シフトした場合2倍されてます。もし2シフトさせた場合は4倍、3シフトさせた場合8倍となります。
では逆に右にシフトさせた場合はどうなるだろうか
1 | 1 | 0 | 0 | (12) |
---|---|---|---|---|
↘︎ | ↘︎ | ↘︎ | ||
1 | 1 | 0 | (6) |
答え110(6)
どうだろう…。察しの言い方はもしかしてと思うかもしれないが、つまりこういう法則が成り立つわけです。
「左にnシフトさせると、シフト前の数2^n倍」
「右にnシフトさせると、シフト前の数1/2^n倍」
##【論理シフトと算術シフト】
また、シフト演算には二つ方法があり、それが「論理シフト」と「算術シフト」です。
え?二つもあんの?ってなるかと思いますが、この二つ差はほとんどありません。
違いは以下の通り、
論理シフト・・・符号(+とかー)を考慮しない方法
算術シフト・・・符号(+とかー)を考慮する方法
これだけ。
複雑に考えても仕方ないのでいろんな説明省くと、とりあえず「算術シフト」だけ覚えておけばいいってことです。
ってことで論理シフトについては詳しくは解説しませ〜ん
##【算術シフトの計算方法】
先ほど説明した通り符号を考慮する方法ですが、前の記事にも説明した通り符号はビットの先頭数字を使って判断しています。
例)−28を表記する場合
1 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
---|---|---|---|---|---|---|---|
↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ | ↓ |
- | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
- | 2 | 8 |
では算術シフトの説明をするわけですが、やり方は先ほど説明した通り基本的には左右にシフトさせていくだけです。
ですが算術シフトには以下のルールがあります。
・シフトさせた時にはみ出た数字がある場合はその数を取り除く
・シフトさせた時に開いた隙間には0または1を入力する(←0か1を入れるルールは後述する※)
例)-28を算術シフトさせる場合
元の数 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | ||
---|---|---|---|---|---|---|---|---|---|---|
↙︎ | ↙︎ | ↙︎ | ↙︎ | ↙︎ | ↙︎ | ↙︎ | ↙︎ | ↙︎ | ||
左シフト(2^n) | (1) | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | |
↘︎ | ↘︎ | ↘︎ | ↘︎ | ↘︎ | ↘︎ | ↘︎ | ↘︎ | |||
右シフト(1/2^n) | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | (0) |
【★ポイント】
①()で囲んだ部分がシフトさせた時に取り除かれた数字で本来ならば書かない
②シフトした時に8ビット内で空白が出た部分には0または1を補填している
※数字を補填する際のルール
空白ができた時に補填するルールは以下のルールがある
左シフトでできた(右側にできる)空白・・・0を補填
右シフトでできた(左側にできる)空白・・・符号と同じ数字(0または1)を補填する
#■掛け算・割り算
ここまで長々とシフト演算の方法を説明してきましたが、ここでようやく掛け算、割り算のやり方を説明していきます。
冒頭で説明した内容を覚えていますでしょうか?
2進数では以下のルールがあったかと思います。
左側にシフトする=2^n (+nシフトするごとに2^n)
右側にシフトする=1/2^n (-nシフトする毎に1/2^n)
つまりここで何が言いたいのかというと
2進数における掛け算、割り算は全て2^nを使って行うことができるのです
##【掛け算】
掛け算についてですが、例を元に説明すると
例)
2 x 8
= 2 x (2^3)
= 16
2 x 15
= 2 x (2^3 + 2^2 + 2^1 + 2^1)
= 30
このように数字を2^n同士の足し算に置き換えることによって簡単に表すことができます。。
##【割り算】
対して割り算ですがこれも実は簡単です。
小学校の時に学んだ割り算を筆算するやり方を用います。
例)
15 ÷ 3
=1111 ÷ 11
=?
1 | 0 | 1 | ||||
---|---|---|---|---|---|---|
1 | 1 | ) | 1 | 1 | 1 | 1 |
1 | 1 | |||||
1 | ||||||
0 | ||||||
1 | 1 | |||||
1 | 1 | |||||
0 |
つまり答えは**101(5)**となるわけです。
実はこれ算術シフトを行って計算していることにお気づきでしょうか?
11(3)を順に算術シフトしていき(1100、110、11)
それぞれの数字で1111(15)から引き算しているだけなのです。
#■次回は…
ここまで読んでくださりありがとうございます。
とりあえず一つ目のタイトルはこれにて終了です。
n進数について少しでも理解がしやすくなれば幸いです。
次回は別のタイトルにて書かせていただく形になるかと思います。
とても個人的なアウトプットとして書かせていただいているので少し場違いかんが否めませんが、今後も継続していきたいと思います
ではまた次の記事にて!!