n 進数について

10 進数(decimal)について

昔の人は数を表すのに、両手の指で足りないときは石を並べたりしていたのでしょうか。今でも 10 以上は「たくさん」ですませてしまうところも、 地球上のどこかにはあるかもしれませんね。

これではめんどうなので、「n 進数」という考え方ができたのでしょう。 今の世の中では 10 進数がメジャーですが、これは両手の指の数の合計から来たことは想像にかたくありません。

ご存知のように、10 進数では 0 〜 9 までの 10 個の「記号」を 並べていけば、理論上どんな整数でも表すことができるようになっています。 数を表す記号の種類が 10 進数の場合 10 種類なわけですね。

ところが、10 という数字は 1 種の決め事であり、 世の中には 10 進数以外の数え方で考えるものもたくさんあります。 たとえば時間は 10 進数で表現しますが、60 とか 24 とかいう中途半端な単位で 繰り上がりますね。聞いたところによると、フランス語では 60 進数みたいな 数え方をするらしいです。ただし 1 進数はありません。これでは0しか 表せないからです。

コンピュータの世界では、物理的には電気のオン−オフをそのまま 情報として使用するのが都合が良かったので、ここから 2 進数が生まれたんだと思います。たとえば電気が通じている状態を 1、切れている状態を 0 (またはこれらの逆)で表すようにしたわけです。2 進数では記号が 2 つしか 必要としないので、もともとあった数字のうちの 0 と 1 が使われています。 この 1 桁の 0 または 1 を記憶する単位のことをビットと呼びます。

2 進数(binary digit)について

2 進数とは

2 進数では記号が 2 種類しかないので、 ある数を表すときに 10 進数より多くの桁数を必要とします。

10進数2進数
11
210
311
4110
5101
6110
7111
81000
2進数一覧表

なんだか覚えづらいですね。

2 進数の性質

これを、単なる数の羅列で考えるのではなく、ある規則性を持たせてみましょう。実は、2 進数は 2 のべき乗表現で表すことができます。下の図を見てください。ここで、’^’ はべき乗(xのy乗)を、’*’ は掛け算を表します。たとえば 2^3 なら 2*2*2 です。

10進数(2 のべき乗表現)2進数(8桁表現)
0(2^3)*0+(2^2)*0+(2^1)*0+(2^0)*000000 0000
1(2^3)*0+(2^2)*0+(2^1)*0+(2^0)*110000 0001
2(2^3)*0+(2^2)*0+(2^1)*1+(2^0)*0100000 0010
3(2^3)*0+(2^2)*0+(2^1)*1+(2^0)*1110000 0011
4(2^3)*0+(2^2)*1+(2^1)*0+(2^0)*01000000 0100
5(2^3)*0+(2^2)*1+(2^1)*0+(2^0)*11010000 0101
6(2^3)*0+(2^2)*1+(2^1)*1+(2^0)*01100000 0110
7(2^3)*0+(2^2)*1+(2^1)*1+(2^0)*11110000 0111
8(2^3)*1+(2^2)*0+(2^1)*0+(2^0)*010000000 1000

この表では、2 進数の 8 桁表現を併記しています。理由は、コンピュータ内部で使われる記憶領域の数え方(=メモリ上の記憶の単位)は、上記の「ビット」ではなく、バイト(=8 ビット)が使われるからです。つまり、0 という 1 ビットで表現可能な数を記憶するために、コンピュータ内部では最低でも 8 ビット分の記憶領域が消費されます。

2 進数から 10 進数への変換

どうでしょう。2 進数の(右から数えて)1 桁目は 2 の 0 乗(つまり 1)が何個あるかを表し、同様に 2 桁目は、2 の 1 乗(つまり 2)が何個あるかを表していますね。これを一般化すると、

「2 進数の右から n 桁目は、2 の n – 1 乗が何個あるかを表す」

ことになります。これで、任意の 2 進数を 10 進数に変換するための方法が分かりました。

ためしに 2 進数の「00110001」を 10 進数に変換してみましょう。今後は便宜上 2 進数は「」でくくることにします。

 「00110001」
= (2^5)*1 + (2^4)*1 + (2^0)*1
= 32 + 16 + 1
= 49

ということで、「00110001」は 10 進数では 49 となります。

10 進数から 2 進数への変換

今度は、10 進数の 123 を 2 進数に変換してみましょう。

2 進数の各桁は、それぞれ 2 の n 乗があるかないかを示しているということができます。では、2 の n 乗の値を具体的に羅列してみると、以下のようになります。分かりやすいように、右から書いています。

…、256, 128, 64, 32, 16, 8, 4, 2, 1

ここで、10 進数 123 はこの中の最大どの数を含んでいる(その数より大きい)かを考えてみますと、128 よりは小さくて、64 を含んでいることがわかります。64 は上記の右から数えて 7 番目ですから、123 を 2 進数に直すと 7 桁になり、1 番大きい桁は 1 となります。つまり、「1??????」という数になります。

次に、先頭の 1 は確定したので、残りの数を求めるために先頭の 1 を除外します。除外するとはすなわち引くことなので、残りの数は

123 – 64 = 59

となります。59 は 64 の次の 32 を含んでいますので、6 桁目にも 1 が立ちます。つまり、

「1100000」 = 64 + 32 = 96

96 まで確定したので、残りの数を求めるためには、

123 – 64 – 32 = 27

です。同様にして、

除外した数(10 進表記)引いた残り
1000000(64)59
+100000(32)27
+10000(16)11
+1000(8)3
+10(2)1
+1(1)0
————————————————
1111011

となるわけです。これを応用すればなんとか計算できるようになりますが、いかんせん 1 と 0 だけでは見やすいとはいえませんね(私もさんざん間違えて、いろいろな方にご指摘いただきました。この場を借りてお礼申し上げますm(__)m )。そこで登場するのが16進数です。

16進数(hexadecimal)について

16進数とは

123 が「1111011」になるのは何とかおわかりいただけたのではないかと思いますが、これは人間にとってとても見やすい数字とはいえません。

人間にとって見やすく、かつコンピュータにとっても割と都合がいい表記法として、16 進数というのがあります。これは

「2 進数を無理矢理 4 ビットずつに分け、
その単位で記号にしてしまえ」

というものです。つまり、123 の 2 進表現である「01111011」(「1111011」を 8 桁表現にするために、先頭に 0 を付加したもの)を「0111 1011」と表記し、これを 2 桁の記号でと表そうというわけです。

4 ビットずつに分けると、各々のかたまりについてのパターンが 0000 〜 1111 まで 16 通りありますね。(理解できない方は、紙に書いて確かめてください。 1 桁で 0 または 1 の 2 通りですから、4 桁あると 2 × 2 × 2 × 2 で 16 通りになるはずです。)16 通りの数字を 1 桁で表すために 16 個の記号が必要になるので、16 進数というわけです。

0 〜 9 では 10 種類しかないですから、足りない分は短絡的にアルファベットの A 〜 F を拝借することにしたようです。ということで、変換表は以下のようになります。この分だけは完全に暗記して、即時に変換できるようにしておいてください。

10 進数2 進数16 進数
000
111
2102
3113
41004
51015
61106
71117
810008
910019
101010A
111011B
121100C
131101D
141110E
151111F

先に例を挙げた 123 の 2 進表現である「0111 1011」を、この表を元に 16 進数に変換してみると、「7B」になるのがお分かりいただけると思います。

16 進数の性質

これも 2 進数と同様で、2 のべき乗のところが 16 のべき乗に変わるだけです。では、いくつか例を示します。便宜上、16 進数は 0xXX と表記します。

0x100
= (16^2) * 1 + (16^1) * 0 + (16^0) * 0
= 256

0xFF
= 0x100 – 0x1
= 256 – 1
= 255

0xFFFF
= 0x10000 – 0x1
= (16^4) * 1 + (16^3) * 0 + (16^2) * 0 + (16^1) * 0 + (16^0) * 0 – 1
= (16^2) * (16^2) – 1
= 256 * 256 – 1
= 65536 – 1
= 65535

では、この調子でがんばってマスターしてください\(^。^)/。

タイトルとURLをコピーしました