基数
いろいろなところ(カレンダーや時計etc)で「数字」が出てきます。
この数字というのは、ある事象の大きさを表すことに用いられますね。
10進数と言うのは普段一番よく使われる数字のことで、
0〜9までの10個(0,1,2,3,4,5,6,7,8,9)を基数とする表記法のことです。
10進数で「321」とあると、通常は「さんびゃくにじゅういち」と読み、
意味として、「3が100個、2が10個、1が1個」あるということを表しています。
なぜ「3」は「100」なのに「2」や「1」は「100」ではないかというと、
「10進数において右から3番(桁)目は10の二乗なので、3は100」であり、
「右から2番(桁)目は10の一乗で10、一番右の桁は10の〇乗で1」だから、です。
言い方を変えると、「右から3番目は10の重み(係数)が2つ(二乗)付いている」となります。
10進数において、係数は1,10,100,1000,…と桁数に比例して10倍ずつ増えます。
つまり、「右からX番目の桁は、10の重みが『X−1』乗だけ付いている」ということです。
各々の数字に、各々の係数を乗算することで、その数全体の大きさを知ることができます。
「321」は「『3×10の二乗』+『2×10の一乗』+『1×10の0乗』」
Xの0乗は、Xがどんな数字であっても答えは1となるので、知らなかった人は覚えておきましょう。
繰り上がりの話ですが、10進数では、基本である「0」から順に1ずつ増えて行き、
10種類目の「9」の次は再び「0」に戻り、上位(左側)桁に「1」が現れます。
この表現が分かりにくいなら、見えてないけど、元々全ての桁に初期値の0が入っていると考え、
「9」が「0」になり、左側の「0」に「1」足されて「1」になると考えてください。
これが、数字の繰り上がりと言うものです。
2進数や16進数と言うものも、10進数と原理は同じです。
例えば2進数なら、基本の「0」から2種類の数字(0,1)を用いて、
桁上がりは、用いる数字の中で最も大きい「1」の次ですので、
「0」「1」の次は「10」となり、「11」の次は「100」となります。
「10」や「11」の読み方ですが、「じゅう」や「じゅういち」ではなく、
「いちぜろ」「いちいち」と読むのが普通だと思います。
重み(係数)も「2のX−1乗」となり、右端桁は0乗の為に10進数と同じ「1」になりますが、
右から2番目の係数は「2」、3番目は「4」、4番目は「8」、5番目は「16」…となります。
16進数も同じですが、基数が10進数より大きく、1桁で16種類必要となります。
10種類(0〜9)はそのままで、以降はアルファベットをA(またはa)から順に用います。
つまり、16進数の場合は「0〜9」と「A〜F」ですね。
読み方も2進数と同じで、「いちいち」や「いちびー」等となる…と思います。
係数は「16のX−1乗」なので、右端桁から順に「1」「16」「256」「4096」…です。
10進数と2,16進数のそれぞれの値の対応表を書くと、
| 2進数 | 10進数 | 16進数 |
| 0 | 0 | 0 |
| 1 | 1 | 1 |
| 10 | 2 | 2 |
| 11 | 3 | 3 |
| 100 | 4 | 4 |
| 101 | 5 | 5 |
| 110 | 6 | 6 |
| 111 | 7 | 7 |
| 1000 | 8 | 8 |
| 1001 | 9 | 9 |
| 1010 | 10 | A |
| 1011 | 11 | B |
| 1100 | 12 | C |
| 1101 | 13 | D |
| 1110 | 14 | E |
| 1111 | 15 | F |
| 10000 | 16 | 10 |
2,16進だけでなく5,7進数だって20進数だって存在します。
それらの基数を使用しないのは、単純に利用価値(メリット)がほとんどないから、です。
2進数は、コンピュータが理解するデジタル信号に使用されますし、
16進数は、2進数の延長で1KB(1,024)や1MB(1,048,576)を表すのに簡単です。
また、2進数の4桁分が16進数の1桁に相当し、考えてすぐに暗算でも変換できます。
例えば「11001001」という2進数ならば、「1100」「1001」と2つに分解し、
それぞれを16進数で表すと「C」と「9」になりますが、
実際「11001001」は10進数で「201」であり、16進数にすると「C9」です。
尚、通常は何進数を表しているのか「11001001(2)」という様にカッコ書きで表します。
HSP2用ですが、TIPSにある基数変換アルゴリズムは次のようにして計算しています。
10から2進数の変換を例にすると、10進数の数値を2で割って出たあまりを一番目の桁とします。
そして商(割って出た答え)を使って2で割り商、余りを出し、商が0になるまで繰り返します。
「11(10)」を2進数に変換する例を書いてみましょう。
| 1 | | 11÷2(基数)の計算をする | |
| 2 | 出てきた余り「1」を1桁目とする | 1(2) |
| 3 | 商「5」を使って5÷2を計算する | |
| 4 | 出てきた余り「1」を2桁目とする | 11(2) |
| 5 | 商「2」を使って2÷2を計算する | |
| 6 | 出てきた余り「0」を3桁目とする | 011(2) |
| 7 | 商「1」を使って1÷2を計算する | |
| 8 | 出てきた余り「1」を4桁目とする | 1011(2) |
| 9 | 商が「0」になったので終了する | |
2進数から10進数に直すのも簡単で、
それぞれの桁の数値に、桁に付く重み(係数)を掛けて全ての桁を足すと答えが出ます。
「1101(2)」を例として流れを書いてみましょう。
| 1 | | 1桁目の数値「1」×係数「1」を計算する | 1(10) |
| 2 | 2桁目の数値「0」×係数「2」を計算する | 0(10) |
| 3 | 3桁目の数値「1」×係数「4」を計算する | 4(10) |
| 4 | 4桁目の数値「1」×係数「8」を計算する | 8(10) |
| 5 | 数値を全て足して終了 | 13(10) |
16進数にしろ、何進数にしろ、基数が変わっても計算方法は同じです。
おさらいとして、2進数「101101001」が10進数で幾つか係数付きで書いておきます。
| + | | + | | + | | + | | + | | + | | + | | + | |
| 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | 係数 |
| × | × | × | × | × | × | × | × | × | |
| 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | (2) |
| −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− | |
| 256 | 0 | 64 | 32 | 0 | 8 | 0 | 0 | 1 | = 361(10) |
2,16進数についての説明をわかりやすく書いたつもりですが、ご理解いただけましたか?
ロジックが今ひとつ分からない方は、そのスクリプトを解析して研究してみてはいかがでしょう?
