さて、今回は「2進数について」の第2回。つまり後半戦だな。
前回に引き続き、八雲藍殿にゲストに来ていただいているぞ。
どうも。さて、前回のまとめだが、要点をまとめると、「なぜ2進数を学ぶのか」「2進数とはどんな数か」「2進数での表現方法」「10進数から2進数への変換」について学んだ訳だな。
そういえば、一度にそれだけやったのね。
疲れるわけだわ。
………で、10進数の「20」が2進数では「10100」になる、って話になったんだっけ。
その通り。そのコツは
「10進数の数字を2で割った答えが0になるまで割り続け、その余りを逆から並べること」
だということだったな。
そう、そこが分からなかったのよねえ。
確かにあの後、2進数で1個ずつ足していったら、ちゃんと20のところで「10100」になったんだけどなあ………納得いかない。
それでは、種明かしをそろそろしようかな。
さて、ここに「495」という数がある。これを10で割ってみようか。
もちろん、余りを付けて、だ。
え、2進数じゃなくていいの?それなら簡単だけど………。
えーと、「495÷10」は………49。で、余りは「5」だね。
ふふふ………その「5」だが、先ほどの「495」の「1の位」と同じだな。
え………あっ………!!
気づいたかな。では、次に「49」を10で割ってみよう。
49÷10=4。余りは………「9」だ。
おお………おおおー………
さあて、最後は「4」を10で割って………と、もう分かったかな。
10で割った余りを下位桁から並べれば、元の「495」になるんだ。
こんな風に、どんな数字で割ったとしても、その余りを下位桁から並べれば「○進数」の数字になるんだ。
なーるほどっ!これはスゴイねっ!!
よーし、これなら2進数なんてちょちょいのちょい、ね!
ほほう。大きく出たな。
では、「-10」を変換してみようか。
えっ?ら、藍殿、いきなりそれは………
まっかせなさい!!「-10」なんてちょちょいの………あ、あれ?
(ニヤニヤ)どうした、藤原の。
「-10」………マイナス10………「マイナス」?
………やれやれ。安請け合いをしてはいけないぞ、妹紅。
お前はまだ2進数の「負数」の表現を理解していないだろう。
え………負数………って?
その名の通り、「負の数」………つまりマイナスのことだ。
コンピュータは「0」と「1」しか扱えないため、
2進数は10進数と違い「+」「−」などの符号を付ける場所が存在しない。
ちょ、ちょっと!
それじゃ2進数は「正の数」しか表現できないってこと!?
いやいや、そうではない。
さすがにコンピュータもそれでは困る。
何しろ、あらゆる表現を「0」と「1」だけでこなそうというのだ。
「−」ぐらい表現できなくてどうする。
いや、「−」ぐらい………って言われてもなあ。
どうやって表現するのよ、そんなの。
ふふふ、簡単ではないか。「0」と「1」しか表現できないのだから、それで「マイナス」を表すしかなかろう。
つまり………「0」ならプラス、「1」ならマイナス、という風にな。
おおっ、なるほど。
………って、「1」ならマイナスって言われても、「1」は2進数で10進数を表現するときに使ってるじゃない。
たとえば「10100」なんて、1が2カ所もあるんだけどどうするの?
うむ、良い目の付け所だ。もちろん、単に「1」であれば「マイナス」というわけではない。
ある「特定の箇所」が「1」であればマイナスと考えるのだ。
特定の箇所………?
それを説明するために、まずは「コンピュータでの表現の限界」を説明しなければならないな。
え?限界?どういうこと?
コンピュータといえども、表現できる数には限界がある、ということだな。
ちなみに2進数の1つの桁を「ビット」という呼び方をするのだが、
たとえば「このコンピュータは8ビットしか表現できません」「16ビットしか表現できません」というような制約が存在するわけだ。
8ビットってことは、8桁か。ってことは「11111111」………「255」までしか数えられない、ってこと?
察しが良くて助かる。ところで藤原の、今の「11111111」に「1」を足したらどうなると思う?
「1」を?「11111111」+「1」は、「100000000」になる………んだけど、
さっきの「8ビットしか表現できない」ということを考えると、この値は表現できない、ってことになるの?
お見事。この場合は、下位8ビットが残される。つまり先頭の「1」は削られてしまうわけだ。
なるほど、下位桁しか残らない、と。
………ってことは、これは結局「0」になっちゃうってことなの?
うむ。面白いだろう?
さて、話を戻そう。このようにコンピュータは表現の限界がある。
そして今回の場合、この8ビットを使って「マイナス」も表さなければならない。
マイナスも?それって無理じゃない?
だって、もう「0」〜「255」までの数字が使われることになってるじゃない。
そう。普通に考えたら無理だ。そこで考えを変える。
「一番最上位の桁を、符号代わりに使ったらどうか?」と。
最上位の桁を符号に………。
そこで、「0」ならプラスに、「1」ならマイナスにするってことなの?
ふふふ、その通り。さて、ということでここからは「補数」の説明をしたいと思う。
補数?なにそれ。
簡単に言ってしまえば「マイナスの数をプラスの形で表す」表現方法だ。
ちゃんとした定義では「足すことによって桁上がりをする値」になる。
足すことによって桁上がり………ねえ。
つまり、「2」の補数は「8」ってことでいいの?
そうそう、それでいい。
しかしそれは10進数の場合だな。
10進数は普段から使っているから簡単に考えられるが、2進数はどうかな?
たとえば「01001011」(=75)の補数を考えてみようか。
に、2進数の場合っ?
え、えーと、桁上がりだから………ん、待てよ、元の数が75だから、補数は25………?
ええい、きっとこうだ!「00011001」でどうっ?
ふむ、10進数ならばそれで当たりだが、肝心なことを忘れてはいけないな。
10進数と2進数では「桁上がりの仕方が違う」という基本的なことを。
10進数では0に10加えれば桁上がりするが、2進数ではその間に何回桁上がりすると思っている?
あ、ああっ、しまったあ!!
………とはいえ、考えなしにやったことではないのでよしとしよう。
実は2進数の補数を求めるためには、ちゃんとした手順が確立されている。
それを紹介しておこうか。
むー………そっちを早く教えてくれればいいのに。
そう言うな。物事には順序がある。
さて、2進数の補数を求める方法だが………2進数において、「1を足すことによって桁上がりをする」ための条件とは、何だ?
2進数での桁上がり?
そりゃ、次の桁に行くわけだから、「全て1」の状態じゃない?「11111111」とか。
ご名答。
ということは、だ。元々ある数に何かを足して「全て1」の状態になれば、そこにまた1を足して桁上がりをすることになるな。
ふんふん、その通りだね。
………あれ、あれれ………ちょ、ちょっと待って!
ということは………これ、元の数の「0」のところが「1」になって、「1」のところが「0」になっている数を足せば、全部「1」になるんじゃないの!?
むむっ、そこまで気づいてしまったか、お見事だ。
その通り、「01001011」に対しては、「1」と「0」を反転した数である「10110100」を足せば、「11111111」になる。
そして、それに「1」を足せば………見事、桁上がりとなる。
つまり、「10110100」に「1」を足した「10110101」が「補数」となるのだ。
おおっ、やったあ!予想通り!
さあて、これで2進数の負数なんて楽勝………って、あれ?
ねえ、この「補数」って、2進数のマイナスとなんか関係あるの?
これって単に「足して0になる数」を求めただけじゃん。
何を言うか、大いに関係があるぞ。
この「補数」が無ければ負数の計算が出来ないのだから。
それに藤原の、お主が「足して0になる数」と言ったが、それこそが重要なポイントなのだ。
え、そんなに重要なの?
ホントに、慧音?
ああ、本当だとも。
………さて、尺がそろそろ尽きてきたようだな。
予想外に長くなってしまったが、2進数はこれから情報処理を学ぶ上で基本となる部分だ。
長くなって悪いことはないだろう。
ま、またいいところで次に繋げちゃうのぉ………?
ま、まあまあ。
………しかし今回はゲストの藍殿に大分任せてしまった部分があるな。
次回は私もしっかり役目を果たすこととしよう。
いやなに、これぐらいおやすいご用だ。
紫様の面倒を見ることに比べればこれぐらいなんてことは………と、うわぁっ!
(突如現れたスキマに飲み込まれる)
あっ
あっ
(ゆ、紫様ッ!?い、いやさっきのはつい口が滑ったというか本音が出たというか、ああいや、その、あぁっごめんなさいごめんなさいっ!!)
えーと………慧音?
そ、それではまた次回をお楽しみになっ!!
その「無かったこと」にするのは、ちょっと強引すぎじゃないかなあ………
<前回:2進数のはなし・その1> <次回:2進数のはなし・その3>