位取り記数法
N 種類の記号によって数を表す方法
私たちは数を表現するのに 0,1,2,3,4,5,6,7,8,9 の10個の記号を使っています。一般に10進法といいますが、特にこれでなければいけない・・ということはなく、「記号N個で数を表現することにしましょう。」とみんなでルールを決めてしまえば、実は何の不自由もなく、数を表現することができます。10進法が世界に広まったのはフランス革命の革命政府がメートル法とともに10進法を定めて以来と言われていて、それ以前は様々な表現が用いられていました。
なぜ10進法がメジャーになったのか、強いていえば人間の手の指の数が両手で10本あるということ・・。特に10進法が優秀な記法であるというわけではありません。まずその呪縛から意識を解放することが、この先の理解に必要です。
例えば 1/3 という量は、10進法の場合 0.333・・・・となって表現できませんが、3進法では 0.1(3) と、小数点以下1桁で表現できてしまいます。
一般記法
N進法(N個の記号を使う)の ABC.DE という数は、以下のような意味をもつものとしてして表現されます。これを計算すると10進数での表現が得られます。
具体例
- 10進法:使う記号は、0,1,2,3,4,5,6,7,8,9 の10個。
例えば、10進法の 256.34 は以下のように書けます。\[2\times10^2 + 5\times10^1 + 6\times10^0 + 3\times10^{-1} + 4\times 10^{-2}\]
- 5進法:使う記号は、0,1,2,3,4 の5個。
例えば、5進法の 231.24 は以下のように書けます。\[2\times5^2 + 3\times5^1 + 1\times5^0 + 2\times5^{-1} + 4\times 5^{-2}\]\[ = 2\times25 + 3\times5 + 1 + 2\times0.2 + 4\times0.04 = 66.56\]
- 例えば、46個の記号(あいう・・わをん)を使った かきく.け は、
あ,い,う・・ を 0, 1, 2・・として計算すると・・\[か\times46^2 + き\times46^1 + く\times46^0 + け\times46^{-1} \]\[= 5\times2116 + 6\times46 + 7 + 8\times0.02174 = 10863.173\]
2進法
コンピュータの世界でおなじみの表現です。コンピュータ、日本語にすると電子計算機ですが、その電子回路の中では、電圧の高低(電流のON/OFF)によって信号が処理されています。したがって数(データ)の表現には、それを1と0に対応させる2進法が利用されます。
- 使う記号は2つ 0 , 1 です。
- 例えば、4桁の2進数 1101 は、10進数の13を意味します。
\[1\times2^3 + 1\times2^2 + 0\times2^1 + 1\times2^0\]\[= 1\times8 + 1\times4 + 0\times2 + 1\times1 = 13\]
2進数の加算
2進数同士の加算は、以下のようなイメージになります。
以下、1110 + 101 = 10011(14+5 = 19)の計算です。
1 | 1 | ← 繰り上がり | ||||
1 | 1 | 1 | 0 | 14 + 5 | ||
+) | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 1 | = 19 |
16進法
これもコンピュータの世界でおなじみの表現です。2進4桁分でちょうど16進1桁に相当するので、2進数表記の代用としてよく用いられます。
- 使う記号は16個 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F です。
- 4桁の16進数 F52A は、10進数の 62,762 を意味します。
\[F \times16^3 + 5\times16^2 + 2\times16^1 + A\times16^0\]\[= 15 \times4096 + 5\times256 + 2\times16 + 10 \times1 = 62,762\]
具体例|色値
色を表すRGB値にはこの16進数が用いられます。例えば、
- #00 00 00 は、R:0 G:0 B:0 で黒
- #FF FF FF は、R:255 G:255 B:255 で白
- #FF 00 FF は、R:255 G:0 B:255 でマゼンタ
#記号は「それが16進数である」・・という意味です。
固定小数点と浮動小数点
コンピュータが扱う数値には、2つのカテゴリがあります。小数点の前後の桁数を固定して数値を表す固定小数点と、指数表現を用いることで小数点の位置を変化させて表す浮動小数点の2つです。
固定小数点
固定小数点は小数点の桁数を固定するもので、先頭を符号(0:+, 1:ー)、次に整数部、最後に小数部、という構成で、数値を表現します。小数点の位置が決まっているので扱いは簡単になりますが、表現できる数値の範囲が限られます。
例えば、16ビットで小数点の位置を中央(8桁目)と定めた場合、十進数の+5.25 という数値は以下のように保持されます。
0 000 0101 0100 000
最初の 0が符号+、続く7桁が整数部5、続く8桁が小数部 0.25(0x10-1 + 1x10-2 + 0x10-3・・) という意味です。
浮動小数点
浮動小数点は、指数部と仮数部を用いた指数表記を使う表現で、32ビットの場合、先頭を符号(0:+, 1:ー)、次に指数部、最後に仮数部という構成で数値を表現します。この形式を用いると、表現できる数値の範囲が広がります。
例えば、32ビットで 十進数の+0.375という数値は
0.375 = 0.011(2) = 0.11(2) x 2-1 と正規化して、
以下のように表されます。
0 111 1111 11000000 00000000 00000000
なお、指数部は、先頭が1のときは、負の数として2の補数を使う約束になっています。この例の 111 1111 は 1を加えると 7桁の範囲で 0クリアされる・・という意味で、-1 を意味します。
付記1:2の補数とは
有限桁の加算器で減算を行うための表現で、10進数2桁の例でいうと、-25 を 75 と表現するものです。 25を引く・・という操作は、2桁の世界では、75を足すことで、同じ結果になります。 60 - 25 = 60 +75 = (1)35 という仕組みです。2の補数は、2進数の世界でこれを利用するアイデアです。
例えば、2進数8桁で、負の数を2の補数で表現すると・・
- 0000 0101 であれば、正の数で 101 すなわち +5(10)
- 1111 1011 であれば、負の数で 1 0000 0000 - 1111 1011 = 101 = ー 5(10)
付記2:integer型 と float型
プログラミング言語において数値を扱う際は、整数と小数点以下を含む実数とで変数のデータ型を区別します。integer型 は整数、float型 は実数を扱うものです。"float" は、実数を扱う「浮動小数点」の「浮動」に由来するものです。
integerとfloatは数値の型として相互に変換することができます。例えば、Python言語で int( )を使うと整数型に(小数点以下切り捨て)、float( )を使うと浮動小数点型のデータに変換できます。