Infomation

 長月が誰かに説明してきた、いちいち毎回言葉にするのが面倒臭い程度に長い蘊蓄です。
 純粋にプログラミングとは言え無いトピックも混じってたりします。

目次

一般知識

コラム

n進数ってなんざんしょ?

n進数、プログラミングやってると結構色んな数を扱います。
とりあえず10進数、2進数、16進数は普通に扱ってるんじゃないでしょうか?
8進数なんてのも場合によっては使うかも知れません。
じゃあこのn進数って一体なんなのか?
簡単な説明は出来ても実際どういう事なのかきちんと説明するのは難しいところです。
こんなコラムを偉そうに書いている長月も、きちんと説明しろと言われたら困ります。
説明と言うのは簡潔にまとめることも重要な要素ですが。
どうまとめて良いやら皆目見当付きません(;´ー`)y-~~
と言うことで、「どこかに文書化しておけば後は"これを見ろ"で済むかなぁ?」と文書化してみる事にします。
まぁ数学サイトじゃないので正確性は保証しませんがw

桁上がり

とりあえず、長月さんは習うより慣れろと言うのが上達の道だと思ってる人なので。
n進数が解らないなら、n進数を定義してみようと思います。
n進数と言うのは、nの時点で桁上がりする。
或いは、数の種類がn個の数。
これらの集合ですから、その条件を満たしたn進数を考えてみます。
適当に6進数でも考えてみましょうか。
6進数は10進数で言う6のx乗になった時点で桁上がりが発生します。
0、1、2、3、4、5、10と言った具合です。
当然それ以上の桁でも54、55、100となります。
10進数の場合でも考え方は同じです。
7、8、9、10や、97、98、99、100と同じですね。

四則演算

数の集合を定義するわけですから、四則演算が出来ないと条件を満たしているとは言えません。
なので、6進数に付いても四則演算を考えてみます。
まず加算、10進数と同じく1+1=2ですね。
問題は桁上がり・桁下がりが発生する演算です。
なのでx=5+1を考えてみましょう。
10進数でx=5+1を解くと6ですね。
6進数では6は無く、代わりに桁上がりするので、x=5+1、x=10と言うことになります。
x=4+3でも、x=5+5でも同じ考え方です。
x=4+3=11、x=5+5=14ですね。
このように考えると複数桁でも同じです。

x=23+45
  11
   23
+) 45
 -----
  112
減算も同じように行えます。
x=100-23=33、x=1234-2345= -1111
乗算は反復加算の簡便表記なので、加算が行えるならば可能です。
x=12*3=40、
x=123*45
   123
 *)  45
 ------
  1103
  540
 ------
 10503
最後に除算です。
ここは簡単のため分数から考えます。
       13
x=13/3=--
        3
これは10進数と同じ様に考えられますね。
約分も同じ考え方です。
  13 3
x=--=-=3
   3 1
上記から解るように、結果が整数の除算に関しては簡単です。
では、結果が整数にならない除算はどうでしょう?
x=5/4
  1.13
 -----
4)5
  4
 ----
  1 0
    4
  ----
    20
    20
    --
     0
おや?思ったより簡単ですね。
四則演算が出来ると言うことは、見た目難しい数式でも結局は四則演算の集まりなので。
今回定義した6進数は正当であると言うことになります。
どんなn進数についても上記の通り四則演算は出来ますから(出来なければn進数ではない)n進数を見かけたら、普通の数、つまり10進数と同じ様に扱えると思って差し支えないでしょう。
問題は普段使い慣れている10進数への変換です。
次では10進数への変換をやってみましょう。

変換する。

まず2進数から始めましょう。
2進数は数の種類が2つの数集合ですから。
使用する数字は0と1の2種類です。
例として11010101を10進変換してみましょう。(数は適当です。)
数の種類が2種類と言うことは一桁の取る状態は2。
言い換えるなら基数は2です。
と言うことはある任意の桁をn桁目、その桁の値をmとしたとき、その桁の値はm*2n-1となります。
それを適用すると、11010101は1*27+1*26+0*25+1*24+0*23+1*22+0*21+1*20となります。
これを計算すると213ですね。
逆算してみましょう、10進数から2進数への変換は2で割り続けます。
余りの出た所が1になります。

2)213
 ----
2)106...1
 ----
2) 53...0
 ----
2) 26...1
 ----
2) 13...0
 ----
2)  6...1
 ----
2)  3...0
 ----
2)  1...1
 ----
    0...1
ちゃんと11010101が出ましたね。
他の進数に関しても要領は同じです。
次は16進数で試してみましょう。
例としてD5を10進変換してみます。
16進数では基数が16なのでm*rn-1に当てはめると。
m*16n-1になります。
では素直に適用してみましょう。
x=D*161+5*160
 =13*161+5*160
 =213
となりました。
逆変換も同じ要領でやってみましょう。
16)213
  ----
16) 13...5
  ----
     0...13=D
簡単に出来ますね。
慣れれば暗算で出来るようになります。
では16進数を2進数に変換してみましょう。
いつまでも同じ数では面白くないので例として2Cを使ってみましょう。
16進数から2進数、また、2進数から16進数への変換には一つコツが有ります。
2進数の4桁は16進数の一桁となります。
つまり、上記の2Cの場合、2とCは別で考えても良いのです。
2進数変換してみましょう。
x=2*160
 =2*1
 =2
2)2
 --
2)1...0
 --
  0...1・・・(1)
 
x=C*160
 =C*1
 =C
 =12
2)12
 ---
2) 6...0
 ---
2) 3...0
 ---
2) 1...1
 ---
   0...1・・・(2)
(1)(2)から
101100
となります。
逆変換してみましょう。
101100を4桁でまとめると0010と1100ですから。
x=0*23+0*22+1*21+0*20
 =0+0+2+0
 =2
16)2
  --
   0...2・・・(1)
 
x=1*23+1*22+0*21+0*20
 =8+4+0+0
 =12
16)12
  ---
    0...12=C・・・(2)
(1)(2)から
2C
となります。
とまぁ、計算してみましたが、実は2進数と16進数の相互変換は暗記が一番早いですね。
以下が10、2、16、8進数の対応表です。
それを見ると2、16進数間は憶えた方が早いと解ります。

10進数2進数8進数16進数
000000000
010001011
020010022
030011033
040100044
050101055
060110066
070111077
081000108
091001119
10101012A
11101113B
12110014C
13110115D
14111016E
15111117F

さて、なんだかもう収拾付かないぐらい長い訳ですが。
ここまでお付き合い下さった方々ありがとう御座います。
最後にまとめると、n進数とは数の種類がn個であり、四則演算が可能である物である。
n進数として成り立っている物は相互変換が可能。
と言うことになります。
なんでこれだけで済む物にこれだけの説明をしたのだろう・・・?
まぁとりあえずこれが誰かの役に立つことを祈りますw