Tany's Blog

数体系(Number System)の基本


情報がコンピュータ上でどのように表現されるか

普段日常生活で利用する数体系(Number System のこと、数をどのように表現するかについて体系)は、10 進数というものが使われています。 これは、0-9 の数字を使ってものを数える方法です。 10 進数は人間の指が 10 本であることから、広く利用される Number System になっています。

一方でコンピュータで利用する際、人間の指に当たるのがトランジスタと呼ばれる電圧(on と off)によって 2 つの状態を管理するコンポーネントです。 それ故に、コンピュータ上では 2 進数(バイナリ)と呼ばれる Number System を利用して数を管理しています。

それぞれの数の数え方は、例を挙げて見てみるとわかりやすいので以下では、りんごの数え方を 10 進数と、2 進数との比較を示します。

2 進数: 0,1,01,11,100....01100100 10 進数: 0,1,2,3,4....100

このように、数の体系が変われば表される数が同じでも表し方が異なっています。 これらをまとめると、10 進数は 0-9 の数値を用いて数を表現するのに対し、2 進数は 0-1の数値を用いて数を表現します。 そのため、10 進数で 9 以降は数の繰り上がりが発生しますが、2 進数においては 1 以降の数で繰り上がりが発生することになります。

コンピュータ上で扱う情報

コンピュータ上で扱う情報の中には、

  • 数値
  • テキスト
  • 画像
  • 動画

などさまざなまデータが挙げられる。先程コンピュータは 2 値で情報を扱っていると説明しましたが、果たしてどのようにこれらの複雑な情報を管理しているのでしょうか?

ただし本当の意味で 2 値(0,1)しか扱えない場合、上記のような複雑なデータをを表現することは難しいため、2 値を組み合わせて表現することが一般的です。

例えば、旗を使ってイメージしてみるとわかりやすいです。

この旗は、上がっているか下がっているか(2 値)だけのシンプルな動きができるとします。 旗が一つの場合は、2 通りの意味を表現することができます。 1*2 = 2

この旗が二つあった場合、以下のように 2*2=4 の意味を表すことができます。

Up/Down
旗 1Down
旗 2Down
旗 1Down
旗 2Up
旗 1Up
旗 2Down
旗 1Up
旗 2Up

このようにして、2 値を組み合わせることによって複雑な値を表現することができます。

文字コードとバイナリ

先程の例を念頭に置いて、再度確認すると 数値は、先程説明した通り 0,1,01,11,100,101...のようにシンプルに表現されます。 テキストデータは、文字コードと呼ばれる数値と、文字を紐付ける規則体系(コード)を用いてマッピングされており、バイナリから見慣れた文字(それこそこのブログの文字などもそれに当たる。)に変換される。

例として、文字コードの一つである UTF-8 で、ひらがなの「あ」という文字について説明してみます。 UTF-8 上で、「あ」は U+E38182 というコードが指定されています。(U+は Unicode 符号位置を表す記号で、その後に続く文字は 16 進数と呼ばれる別の Number System を利用している。)これを更にバイナリに変換することで、数値と文字をマッピングしているということです。

詳しい説明は以下の記事が参考になりました。 【図解】【3 分解説】Unicode と UTF-8 の違い!【今さら聞けない】

Number System に求められる要素

こうした Number System を構成するに当たって必要な要素を改めて確認します。

Scalability (拡張性)

広く一般的に使われるためには、ある程度の基礎知識があれば使いこなせるくらいシンプルなものである必要があります。 それを踏まえた上で、大きな数値でも簡単に表現できる拡張性が求められる。10 進数だと、9を超える数字は他の数字の組み合わせによって表現でき、2 進数でも 0 と 1 の組み合わせによって、どんな数も表現することができる

Consistency and comparability(一貫性)

システムには一貫性が求められます。一部のルールがシステムすべてに当てはまる必要があり、もしこの一貫性が担保されていればスケーラビリティは簡単に実現することができる。

1+1=2, 100+200=300

数がどんなに大きくなっても、ルールは変わらない。

Uniqueness(独自性)

一つの記号が 2 つの意味を持たないように設計しなければ、意味の解読が難しくなっています。 たとえば、同じ Number System において、100 という情報が、文字通りの 100 という意味と 1 0 0 というただの並びを表してしまうと非常に使いにくいシステムになってしまうため、必ず一つの記号が示すものは一つであるべきです。