Publish Patron Only Posts from your WordPress Site

位取り記数法

位取り記数法

位取り記数法

前回「次は自然数」と言いましたが、大事なことを忘れていました。それは自然数を理解してもらうには、前提として位取り記数法を理解することが必要だと言う事です。

と、言う訳で今回は予定を変更して位取り記数法についてお話しさせて頂きます。

位取り記数法って?

位取り記数法(N進法とも呼ばれます)とは数の表現方法の一種です。あらかじめ定められたN種類の記号(数字)を列として並べて数を表す方法の事です。
ここでお話しする位取り記数法はNが自然数の場合についてです。それ以外の場合の広義の記数法については、必要があれば説明します。

今の日本において通常使われているのはN=10である十進法です。皆さんが計算をする時には迷わず十進法で計算しています。

でも、日本では十進法しか使っていないのでしょうか?例えば時間は?時についてN=12で午前と午後を示す十二進法かN=24とする二十四進法が使われていますし、分と秒はN=60とする六十進法が使われています。

基本構造

位取り記数法は、N進法において一つの列にN種の数字と呼ばれる記号で数を表現します。N進法においてはN基数または(てい)と呼びます。この数字を容れる列のことを(けた)と呼びますが、桁の意味する数を(くらい)と呼びます。
一つの列には一つの数字しか容れられません。またこの数字には必ず零を含む数字を含めなくてはなりませんので、一つの列に容れる事のできる数字は0 \sim N-1となります。列の数字が表す数がN-1である時に1を加算した数Nは列に容れることができませんので、列を一つ増やし、増えた列には1を容れて元の列には零を容れます。この時に二つの桁で表される数字がNを表す数となり、この現象を桁上がりと言います。
例えば十進法では10と表しますが、これは整数第一位がで整数第二位がとして表記されます。N進法の数列は「位」がNの冪数で進みます。十進法で表すと123=1 \times 10^2 + 2 \times 10^1 + 3 \times 10^0と言う数を数字と位の積の和で表します。
N進法では

  • 整数第一位はN^0を加数とし一の位とします
  • 整数第二位はN^1を加数とし二の位とします
  • 整数第三位以降も同様です
  • 小数第一位はN^{-1} = 1 \div N^1N分の一の位とします
  • 小数第二位はN^{-2} = 1 \div N^2N^2分の一の位とします
  • 小数第三位以降も同様です

底明記の原則

N進法を複数扱うケースは数学やソフトウェアエンジニアの分野では珍しくありません。その時に、単純に10と書かれたのでは

  1. 十進法で表す1 \times 10^1 + 0→十進法で10
  2. 二進法で表す1 \times 2^1 + 0→十進法で2
  3. 十六進法で表す1 \times 16^1 + 0→十進法で16

であるのかが判断できません。その為に底を明記する事が求められています。一般には10_{(10)}, 10_{(2)}, 10_{(16)}と表記します。

代表的な位取り記数法

代表的なN進法について列挙しておきます。

  • 二進法-binary
  • 八進法-octal
  • 十進法-decimal
  • 十二進法-duodecimal
  • 十六進法-hexadecimal
  • 二十四進法-tetravigesimal
  • 六十進法-sexagesimal

底の変換

簡単の為に非負整数についてのみ説明します。
与えられた非負整数Tを、記号\zeta_0, \dots , \zeta_{N-1}を数字として用いたN進数表記をa_r, \cdots , a_0で表す為に底の変換を行います。
条件M \neq Nの下でM進表記されているTN進表記に書き換える時には底の変換アルゴリズムが使えます。用語アルゴリズムについては別途解説しますが、今は簡単にある計算を行う為の一連の算法と理解してください。
底の変換アルゴリズムは

  • 入力Tを受け取る
  • もしi0に初期化
  • そうではない場合T \neq 0の間、以下の演算を繰り返す
    • TNで割った商をT'、余りをkとして、a_i \leftarrow \zeta_kとする。
    • T \leftarrow T', i \leftarrow i + 1
  • 繰り返し演算が終わった時に
    • r \leftarrow i -1
    • a_r, \cdots , a_0を出力

と、なります。
なお、T > 0に対しては等式r = \lfloor \log _{ N }{ T } \rfloorである事が知られています。なお、上記の底の変換アルゴリズムでは添え字を0から始めていますのでTの桁数はr + 1です。ここで\lfloor x \rfloorは床関数です。床関数は実数xに対してx以下の最大の整数と定義されています。

ソフトウェアエンジニアとして

最低でも二進法十六進法は解説しておく必要があります。その他の代表的なN進法については、機会がありましたら説明します。

二進法

二を底とした位取り記数法で、a_Na_{N-1} \cdots a_1a_0a_{-1}a_{-2} \cdotsと表記されます。但し各位の値a_i0 \lor 1と表される数は位取り記数法の定義により a_{N}2^N + a_{N-1}2^{N-1} + \cdots a_12 + a_0 + \cfrac{a_{-1}}{2} + \cfrac{a_{-2}}{2^2} と言う数を表しています。なお、上式における2は十進法の2です。 二進法を用いれば0,1の二種類の数字のみで零を含む任意の自然数が表現可能であり、負号と合わせる事で整数が表現可能であり、小数点を合わせて四種類の記号のみで実数の表現が可能です。 デジタルコンピュータで扱うデータの最小単位はbitですが、磁気ディスク等では電圧の高低・磁極のN/Sなど、物理現象を二状態のみに縮退(離散化)して扱います。この時、真と偽の二つの真理値のみを使用する二値理論をマッピングします。電子的にはH(High)L(low)で、論理的にはT(True)とF(False)で、数値として01が利用されます。

小数と除算

二進法は因数が2だけですので\cfrac{1}{3},\cfrac{1}{5}と言った奇数分割ができません。二進表記で\cfrac{1}{3} = 1 \div (11)2 = 0.\underline{01}01\cdotsとなり\cfrac{1}{5} = 1 \div (101)_2 = 0.\underline{0011}0011\cdotsと、どちらも無限小数になります。また、偶数でも6_{10}, 10_{10}の様に奇数で割り切れる偶数では1を割り切れません。単位分数は、二の冪数を除いて全て無限小数になります。

十六進法

十六を底とした位取り記数法で0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,Fの数字を用います。A_{16} = 10_{10}, F_{16} = 15_{10}, 10_{16} = 16_{10} と表記します。
底が16ですから、桁が一つ上がると16^1, 16^2を表して整数第二位は十六の位で整数第三位は二百五十六の位、小数第一位は十六分の一の位で小数第三位は二百五十六分の一の位になります。

整数の例

  • 16_{16} = 1_{10} \times 16_{10}^1 + 6_{10} = 22_{10}
  • 30_{16} = 3_{10} \times 16_{10)}^1 = 48_{10}
  • B4_{16} = 11_{10} \times 16_{10}^1 + 4_{10} = 180_{10}
  • 7C5_{16} = 7_{10} \times 16_{10}^2 + 12_{10} \times 16_{10}^1 + 5_{10} = 1989_{10}

小数の例

  • 0.1_{16} = 1_{10} \times 16_{10}^{-1} = {\cfrac{{1}}{{16}}_{10}}
  • 0.5_{16} = 5_{10} \times 16_{10}^{-1} = {\cfrac{{5}}{{16}}_{10}}
  • 0.2A_{16} = 2_{10} \times 16_{10}^{-1} + 10_{10} \times 16_{10}^{-2} = {\cfrac{{42}}{{256}}_{10}}

オクテットと言う考え方

デジタルコンピュータで扱うデータの最小単位はbitで二進法で表記できました。しかし、二進法で大きな数を表現するのは数列が長くなりますので、間違いや見落としの原因となります。更に二進法の数列は人間が直感的に理解することは不可能だと言えます。
そこで8bitsを一つの組として捉えてoctetを単位として表します。octetは必ず8bitsを表します。使い慣れているbyte8bitsを基本的には表していますが、通信分野においては8bits以外を指すこともありますので、厳密に8bitsを定義する場合にはoctetを使います。
そもそもbyte8bits固定ではなく、扱う文字種やワードサイズをいくつかに分割することによって決められる一文字を表す単位でした。歴史的には5bits〜12bitsの幅があります。
1byte = 8bitsと正式に定義されたのは、2008年発行のIEC_800000-13においてです。ですが、キロ・メガ等のSI接頭辞と共に利用される場合に1KBiteが1000Bytesの場合と1024Bytes(2^{10})の二種類が存在する為に、判断を誤りやすいと言う欠点があります。
一方でoctetは必ず8bitsを表します。octetは二進表記の8桁で表現できます。この時、十六進表記を用いると二進表記の4桁が1桁で表記できますから、二進表記よりも短く表す事ができます。1octetsは2桁の十六進表記00_{16} \sim FF_{16}または0x00 \sim 0xFFと表現されます。

ここまでお付き合い頂きありがとうございました。
次回から少し、オブジェクト指向言語について考察してみたいと思います。

執筆を続ける為に Masaruをご支援ください。
Publish Patron Only Posts from your WordPress Site
%d人のブロガーが「いいね」をつけました。