【コンピューターサイエンス】 数体系(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 というただの並びを表してしまうと非常に使いにくいシステムになってしまうため、必ず一つの記号が示すものは一つであるべきです。