Version 4.04
2進数
「さて、前回は〈メモリはスイッチの集まり〉ってことを話しました」
『話されました!』
「この中で」
オフ・おん・オフ・おん
「が 5 を意味するっていうことを話したよね」
『そうそう。でもこれがなんで5?』
「今回はそれについて。まず普通の10進数のことを考えてみましょう。
9 + 1 は」
『 10 でしょ』
「ええっ!?」
『ええっ!? ……って、引っかけ問題?』
「なんで 10 が〈じゅう〉なの? なんで 11 が〈じゅういち〉なの?」
『なんでって言われると……』
「1桁目が 1 なら〈いち〉。じゃあ2桁目が 1 なら?」
『じゅう……?』
「2桁目が 2 なら?」
『にじゅう……』
「普通数字を読む時って直接読むけど、本当は〈ひとけたずつ解析してる〉
ってこと」
『ひとけたずつ?』
「 32 なら、1桁目が 2 だから 2 、2桁目が 3 だから 3じゅう、って」
『だからさんじゅうに、ってこと?』
「そういうこと。じゃ応用問題、16進数!」
『う”、難しそう』
「 F + 1 は?」
『えっと、 Ver 4.02 ( No.052 ) でやったよね…… 0x10 !』
「その 0x10 を10進数で言うと?」
『 F が 15 だから、それに 1 足して 16 !』
「っていう数え方はぺけ」
『ええ〜!?』
「10進数で〈2桁目が 3 だから 3じゅう〉ってしたでしょ。それと同じ
ふうに数えるの」
『おんなじふーにって?』
「〈2桁目が 1 だから1じゅうろく〉ってね」
『??』
「10進数で、2桁目の数字を〈3じゅう〉とか数えるのは、ひとつ繰り上
がると〈じゅう〉になるからでしょ」
『そういえばそうね』
「16進数なら、繰り上がると?」
『じゅうろく』
「だから〈2桁目が1 だから1じゅうろく〉ってこと」
『はぁ……』
「 0x10 は?」
『ええ!? えっと、おんなじふーにすると、1桁目が 0 だから0、2桁
目が 1 だから……1じゅうろく……?』
「 16 が1個で?」
『 16 。あ、16だ。』
「 0x11 を10進数で言うと?」
『えっと、1桁目が 1 だから1、2桁目が 1 だから1じゅうろく』
「ってことは?」
『いちじゅうろくいち』
「じゃないでしょー」
『えっと、 0x10 が 16 だったんだから、 0x11 は 17 になるんだよね。…
…あ、足すってこと?』
「そういうこと。1桁目と2桁目を足すと?」
『 17 』
「じゃあ 0x2C は?」
『えっと、1桁目が C だから 12 、2桁目が 2 だから2じゅうろく』
「 16 が2個で?」
『 32 』
「1桁目と足して?」
『 44 ! あってる?』
「うん。心配ならアクセサリの【電卓】使って確かめてみた方がいいかも」
『あ、ちゃんと確認できるんだね』
「じゃあ 0x100 は?」
『さ、3桁!?』
「……難しそうだから、その前に 0x0F0 は?」
『あ、えーっと、2桁目が F だから 15個の16、だから…… 240 !』
「 0x0FF は?」
『 240 + 15 で 255 だね』
「じゃあ 0x100 は?」
『あ、 0x100 = 0x0FF + 0x001 だから 255 + 1 で 256 なんだ』
「って数え方は」
『ペケ? えーっとねー、2桁目が〈1じゅうろく〉とかだったんだから、
3桁目は……』
「〈じゅうろく〉はどっからきた?」
『えっと〈繰り上がったらじゅうろく〉だから……あ、3桁目に繰り上がっ
たら〈にひゃくごじゅうろく〉だから、 0x100 は〈1にひゃくごじゅうろ
く〉、つまり 256 !』
「じゃ 0x111 は?」
『えーっと、1桁目が 1 だから 1 、2桁目が 1 だから〈1じゅうろく〉
だから 16 、3桁目が 1 だから〈1にひゃくごじゅうろく〉だから 256 、
全部足すと…… 273 !』
「そういうこと。つまり?」
『つまり、各桁で〈その桁の数xその桁に繰り上がる時の数〉を出して全部
足せばいいんだ!』
「そういうことだね。ちなみに〈その桁に繰り上がる時の数〉って簡単に求
められるんだよ。 16 x 16 は?」
『えっと、 256 。あ、2乗すればいいってこと?』
「〈進数の(桁数−1)乗〉で求まるから。ま、〈ひとつ下の桁が繰り上が
る時の数〉が、進数の数だけ集まって繰り上がるんだから、当たり前だけど
ね」
『2桁目から3桁目なら〈 16 になって繰り上がり〉が16回あれば繰り上
がれる、だから 16 x 16 ね。そっちの方が分かりやすそう』
「でも桁数増えると大変だけどね」
『そしたら計算機使うもん』
「では同じようにして〈2進数〉の場合を考えてみましょう」
『にしんすう?』
「そう。まず、メモリのスイッチのオン・オフを、数字の 0 と 1 に置き換
えて考えます」
オフ : 0
おん : 1
『ってことはさっきの』
オフ・おん・オフ・おん
『は』
0101
『ってこと?』
「そういうこと。スイッチはオンとオフのふたつしかないから、 0 と 1 だ
け。 2 とか -1 とかにはならないから」
『だから2進数?』
「そゆこと。そしてここからが大事。この2進数を16進数に置き換えて考
える方法、っていうのが今回の焦点だったよね」
『そうそう、それ教えてもらわないと』
「じゃ、まず全部表として見てもらいましょう」
0000 : 0x0
0001 : 0x1
0010 : 0x2
0011 : 0x3
0100 : 0x4
0101 : 0x5
0110 : 0x6
0111 : 0x7
1000 : 0x8
1001 : 0x9
1010 : 0xA
1011 : 0xB
1100 : 0xC
1101 : 0xD
1110 : 0xE
1111 : 0xF
『う、なんか難しい……』
「えっとね、まず一番右の桁が、一番小さい桁」
『そだね、 0000 から 0001 って、最初に一番右のが増えてるもんね。これ
がひとつ増えると 1 なんだ』
「そう。それがもうひとつ増えると」
『 0010 。なんで?』
「2進数だから、 0002 にはならないで、繰り上がるから」
『繰り上がるから、2桁目が 1 になって、1桁目が 0 。この 0010 が 2
なんだ』
「そう。これは、2桁目が 1 なら、16進数なら 2 を足せばいいってこと」
『どゆこと?』
「その次の 0011 なら、1桁目が 1 だから 1 、2桁目が 1 だから 2 、足
して」
『 3 ! そっか、2進数でも〈その桁の数xその桁に繰り上がる時の数〉
を全部足すっていうのは変わってないんだ』
「そういうこと。だからさっきの表を」
8421
0000 : 0x0
0001 : 0x1
0010 : 0x2
0011 : 0x3
0100 : 0x4
0101 : 0x5
0110 : 0x6
0111 : 0x7
1000 : 0x8
1001 : 0x9
1010 : 0xA
1011 : 0xB
1100 : 0xC
1101 : 0xD
1110 : 0xE
1111 : 0xF
「って書き換えれば、だいたい分かるでしょ」
『 8 4 2 1 って〈その桁に繰り上がる時の数〉のことだよね』
「そういうこと。この数字をその桁の数字に掛けちゃえばいいだけ。だから」
8421
0101 = 4 + 1 = 5
『あ、だからこれが 5 になるんだ!』
「じゃ、2進数で 01010101 は?」
『ぎゃ、8桁!?』
「こういう時は、4桁ずつ16進数に変換するの」
『あ、なるほど。ってことは 0x55 になるから、 5 x 16 + 5 だから 85 !』
「そゆこと。ちなみに2進数も【電卓】で計算できるから」
『確認できるんだ』
「っていうより、自分で色々試して、ある程度暗算で変換できるようにして
おいて」
『はーい』
「さて、整理します。まずメモリの中身は?」
『スイッチの集まり!』
「つまりスイッチのオンオフを直接数字として読むと?」
『……それが2進数ってこと?』
「そういうこと。つまりメモリには2進数として数字が書き込まれてます」
『それを見る時には、今みたいに16進数や10進数に変換すればいいって
ことなんだ』
「そういうことだし、 TRACE() に %X や %d を渡したらそう変換してくれ
るってことでもあるかな。要するに大事なことは」
『メモリは2進数! 10進数や16進数は見た目の変換ってこと!』
「そゆこと」
/*
Preview Next Story!
*/
『でさー、理屈は分かるんだけど、暗算って結構難しくない?』
「誰だってそうだよ、これは。徹底的に練習してもいいし」
『いいし?』
「……ま、ずっとプログラミングしてれば自然とできるようになるでしょ」
『水希ちゃんはそうだったんだ』
「というわけで次回」
< Version 4.05 ビット操作 >
『につづく!』
「ま、プログラミングは理論知ってればいいってもんじゃないってことだね」
『本読んだだけじゃダメってことね。みんなも手を使って練習しよーね』