2進数なお話 その3
2進数について取り上げてきて,三回目.連載ものになってしまいました.話があまりにも,コンピュータ内部の話になっているので,つまらないなと感じている人もいたかなと思っています.とりあえず,この話は今回までにして,次回はもう少しわかりやすいネタやろうと思います.
前回の終わりに「コンピュータの中で四則演算は全て足し算で出来る」と書きました.今回は引き算を足し算でする方法についてまとめて2進数の話は一旦閉じようと思います.ホントは浮動小数点とか論理演算の話もやっておこうかなと思ったんですが,これは後の機会にやろうと思います.
では,まずマイナスの数とはどう表せるのか考えてみます.ちなみに今回も8bitとして考えます.10進数で255という数があります.これを2進数として表すと次のようになります.
0b11111111
ずらっと1が並びます.ここでこれに1を足すと考えます.すると全ての桁で繰り上がりが発生するので
0b11111111 + 0b00000001 = 0b00000000
となり,256は0になってしまいます.気付かれたでしょうか,この計算は「-1 + 1」(または255 - 255)の計算と全く同じことに.
つまり,こう言えるという事です.「10進数で255という数は-1に相当する.」同様に解釈してゆくと...
「10進数で255という数は-1に相当する.」
「10進数で254という数は-2に相当する.」
「10進数で253という数は-3に相当する.」
・・・・
「10進数で3という数は-253に相当する.」
「10進数で2という数は-254に相当する.」
「10進数で1という数は-255に相当する.」
解釈の仕方はわかったものとして,ここで腑に落ちない事があると思います.「結局0b11111111は-1なのか255なのか」という事です.確かにこのままではわかりません.どちらとも意味がとれてしまいます.
そこで考えられたのが,一番左のbit(一番左の桁)で符号を表すことです.0の時はプラス,1の時はマイナスという具合です.これならはっきりわかります.
- 補数
そしてもう一つマイナスを表す際に重要なのが,補数をとることです.補数についての小難しい話は上のリンクをたどってもらうことにして,簡単に言えば,マイナスの数をプラスの数として表す方法というものです.
んで,2進数の場合は2の補数をとらなければなりません.2の補数をとる場合は,まず先に1の補数をとります.とり方は「1-その桁の数」で計算します.2進数はその計算が楽なもんで,1を足す(引く)というのはイコール現在の数の反転という意味になるんですね.(0なら1に1なら0に)
例としてこんな感じ.4の1の補数は
0b00000100 → 0b11111011
1の補数ととった後,その数に対して+1を行います.そうすることで2の補数が完成します.上の例をそのまま使うと
0b11111011 → 0b11111100
となります.試しに4 - 4やってみましょう.
0b00000100
+ 0b11111100
--------------
0b00000000
綺麗に0が並びました.という訳で補数を計算してゆくとこんな感じになってゆきます.
0b01111111は127
0b00000001は1
0b11111111は-1
0b10000001は-127
0b10000000は-128 だといえます.
これら二つの事から,一番最初の考え方と状況が変わった事は,8桁で表せる範囲が変わったという事です.先ほどまでは0~255(もしくは0~ -255)でしたが,今回一番左のbitを符号と置き換えることによって-128~127までの数を表せることになりました.これででしっくりくる計算が可能になりました.マイナスの計算ができれば,もちろんわり算も可能になりますね.
ちなみに,今回は2進数の話なので,2の補数の話を書いていきましたが,10進数だって,同じように10の補数とって,足し算だけで計算も可能なんですよ.おまけでちょっとやってみますか.わかりやすいように4桁で計算してみます.40という数で10の補数をとってみます.
まずは9の補数をとります.まず,9 - それぞれの桁の数の計算をします.
0040 → 9959
そして +1をして,10の補数にします.
9959 → 9960
試しに40 - 40をしてみましょう.
0040
+ 9960
---------
0000
といった感じにこれまた見事に0になりました.というところで三回にわたってやってきたお話もとりあえずココで締めます.
個人的に楽しかったけど,読んでる人は講義みたいでつまらなかったかもしれませんね.懐かしがってくれたり,勉強になりますといったコメントが寄せられましたが,そんなコメントがあった分だけ,とりあげて良かったですよ.
一番上の画像の元ネタ
- 2進数の雨の中
前回の終わりに「コンピュータの中で四則演算は全て足し算で出来る」と書きました.今回は引き算を足し算でする方法についてまとめて2進数の話は一旦閉じようと思います.ホントは浮動小数点とか論理演算の話もやっておこうかなと思ったんですが,これは後の機会にやろうと思います.
では,まずマイナスの数とはどう表せるのか考えてみます.ちなみに今回も8bitとして考えます.10進数で255という数があります.これを2進数として表すと次のようになります.
0b11111111
ずらっと1が並びます.ここでこれに1を足すと考えます.すると全ての桁で繰り上がりが発生するので
0b11111111 + 0b00000001 = 0b00000000
となり,256は0になってしまいます.気付かれたでしょうか,この計算は「-1 + 1」(または255 - 255)の計算と全く同じことに.
つまり,こう言えるという事です.「10進数で255という数は-1に相当する.」同様に解釈してゆくと...
「10進数で255という数は-1に相当する.」
「10進数で254という数は-2に相当する.」
「10進数で253という数は-3に相当する.」
・・・・
「10進数で3という数は-253に相当する.」
「10進数で2という数は-254に相当する.」
「10進数で1という数は-255に相当する.」
解釈の仕方はわかったものとして,ここで腑に落ちない事があると思います.「結局0b11111111は-1なのか255なのか」という事です.確かにこのままではわかりません.どちらとも意味がとれてしまいます.
そこで考えられたのが,一番左のbit(一番左の桁)で符号を表すことです.0の時はプラス,1の時はマイナスという具合です.これならはっきりわかります.
- 補数
そしてもう一つマイナスを表す際に重要なのが,補数をとることです.補数についての小難しい話は上のリンクをたどってもらうことにして,簡単に言えば,マイナスの数をプラスの数として表す方法というものです.
んで,2進数の場合は2の補数をとらなければなりません.2の補数をとる場合は,まず先に1の補数をとります.とり方は「1-その桁の数」で計算します.2進数はその計算が楽なもんで,1を足す(引く)というのはイコール現在の数の反転という意味になるんですね.(0なら1に1なら0に)
例としてこんな感じ.4の1の補数は
0b00000100 → 0b11111011
1の補数ととった後,その数に対して+1を行います.そうすることで2の補数が完成します.上の例をそのまま使うと
0b11111011 → 0b11111100
となります.試しに4 - 4やってみましょう.
0b00000100
+ 0b11111100
--------------
0b00000000
綺麗に0が並びました.という訳で補数を計算してゆくとこんな感じになってゆきます.
0b01111111は127
0b00000001は1
0b11111111は-1
0b10000001は-127
0b10000000は-128 だといえます.
これら二つの事から,一番最初の考え方と状況が変わった事は,8桁で表せる範囲が変わったという事です.先ほどまでは0~255(もしくは0~ -255)でしたが,今回一番左のbitを符号と置き換えることによって-128~127までの数を表せることになりました.これででしっくりくる計算が可能になりました.マイナスの計算ができれば,もちろんわり算も可能になりますね.
ちなみに,今回は2進数の話なので,2の補数の話を書いていきましたが,10進数だって,同じように10の補数とって,足し算だけで計算も可能なんですよ.おまけでちょっとやってみますか.わかりやすいように4桁で計算してみます.40という数で10の補数をとってみます.
まずは9の補数をとります.まず,9 - それぞれの桁の数の計算をします.
0040 → 9959
そして +1をして,10の補数にします.
9959 → 9960
試しに40 - 40をしてみましょう.
0040
+ 9960
---------
0000
といった感じにこれまた見事に0になりました.というところで三回にわたってやってきたお話もとりあえずココで締めます.
個人的に楽しかったけど,読んでる人は講義みたいでつまらなかったかもしれませんね.懐かしがってくれたり,勉強になりますといったコメントが寄せられましたが,そんなコメントがあった分だけ,とりあげて良かったですよ.
一番上の画像の元ネタ
- 2進数の雨の中