2018/10/12

2 進数から文字表現への変換

binary key バイナリ 鍵 キー key
2018 年 10 月 12 日 Emil Hozan 著

世界中のすべてのコンピュータシステムの中核である CPU は、0 と 1 のストリームを受け付けて処理します。値「0」はオフ、値「1」はオンと見なされます。しかしながら、コンピュータがすべてのデータをこれらの値にまで分解するのは、なぜでしょうか。2 進数は英語圏から非英語圏へ、あるいはその逆へとどのように翻訳するのでしょうか。

この記事では、歴史の授業や科学的な説明まで掘り下げて、いくつもの兎の穴に落ちてしまうのを避けながら、この疑問の答えをできるだけわかりやすく解説したいと思います。この記事の目的は、コンピュータがどのように動作するかについての少なくとも高レベルの概要を紹介し、我々がどのような方法で通信できるのかを解説することです。

(B)inary Dig(it) – bit(ビット)

ご存知の方が多いと思いますが、コンピュータシステムの回路には、電気が通っています。この電気の流れは制御可能であり、この流れを制限することで「オフ」状態を登録でき、制限が解除された状態を「オン」と考えることができます。電流はトランジスタを通って流れ、「オン」または「オフ」、すなわち 1 または 0 に設定することができます。最も単純な言い方をすれば、これが、「binary digit」(省略形ではビット)を判断するプロセスです。電気が自由にトランジスタを流れると「1」が登録され、流れなければオフ、すなわち「0」が割り当てられます。トランジスタの使い方や仕組みについては複雑な説明が必要ですが、この記事の範囲を逸脱するため、省略します。

2 進数、8 進数、10 進数、16 進数

我々が現在使用している 10 進数をいくつかの数え方を比較してみることにしましょう。10 進数では、10 の異なる数字、すなわち、0 ~ 9 があるという事実が前提となり、さらには、それぞれの数には、その数が置かれる場所、すなわち、1 の位、10 の位、100 の位、1000 の位によって、大きさが割り当てられます。1 の位に「9」がある場合に何かを加算すると、次の位への「繰り上がり」が発生して、たとえば、9 + 2 = 11 となり、1 の位だけでは処理できず、次の 10 の位へと繰り上げられて加算されます。

無作為の数、ここでは「1024」を使って考えてみることにします。それぞれの数を置かれた場所に従って評価すると、「4」は 1 の位にあるため 1 × 4 = 4、10 の位の「2」は 10 × 2 = 20、100 の位の「0」は 100 x 0 = 0、1000 の位の「1」は 1000 x 1 = 1000 となります。次に、それぞれの結果を加算すると(4 + 20 + 0 + 1000)、全体の数である 1024 となります。この方法が我々にとって簡単で便利なのは、人間の指が 10 本あるからです。これを 2 進数、8 進数、16 進数での数え方と比較してみることにしましょう。

2 進数では、2 つの値、すなわち「0」または「1」を使用します。この方法の最大の特長の 1 つは、次の位が前の位の倍になることです。したがって、10 進数では 1 の位、10 の位、100 の位となるところが、2 進数の場合は 1 の位、2 の位、4 の位、8 の位、16 の位となります。

たとえば、簡単な 2 進数の計算、0101 + 0111 = 01100 を例にすると、2 進数では 0 と 1 以外の数を使わないため、1 と 1 の加算だけで「繰り上がり」が発生します。1 の位から始めると、通常の計算では 1 + 1 = 2 となりますが、この 2 進数の計算では次の位への繰り上がりが発生するため、1 + 1 = 10 となります。上記の例では、01 + 11 = 100 となり、これは、1 の位で加算によって繰り上がり(「1」の追加)が発生し、それがすでに存在していた 0 + 1 に加算されることになります。したがって、式は 1(繰り上がりの数)+ 0 + 1 となりますが、この計算で再び「2」になるために、さらに繰り上がりが発生します。

こういった計算が楽しいと思われる方は、この足し算を続けてみてください。2 進数には、長くなり、読みにくいという問題があります。アプリケーションや定数のストリームなどの場合、映画のマトリックスに出てくるような数字の羅列になり、とても読みやすいとは言えません。幸いにも、エンジニアが開発した、8 進数や 16 進数と呼ばれる、長いデータストリームの読みやすい表現方法があります。8 進数では、8 の異なる数字、すなわち、0 ~ 7 が使用され、7 になると、0 に戻って新たに数え始めます。16 進数の場合は、0 ~ 9 が使われますが、10 になると、「A」~「F」までのアルファベットを使用します。したがって、16 進数では「10」を「A」、「11」を「B」、「16」を「F」と表記します。

文字セット

2 進数を読み取り可能な文字に変換するには、値を区別するために何らかの標準化された形式が必要です。これは、地図の凡例に記載されている、地図記号とその説明のようなものと考えるとよいでしょう。英語圏の国では、コンピュータは ASCII(American Standard Code for Information Interchange)を使用します。この形式は、小文字と大文字の英字(A、B、C、a、b、c など)、数字(1、2、3 など)、および特殊文字(!、@、# など)の 128 のオプションを表記するものです。ASCII 文字セットと 16 進数の詳細についてはこのリンクに説明されていますが、以下の表で概要を理解できるはずです。

非英語圏の国では当然ながら、英語圏と同じ文字を使用するわけではないため、使用する文字セットも同じではありません。さらには、一部の文字の表現には標準のアルファベットより多くのビットが必要であるため、その表記はさらに複雑になります。さまざまな標準化団体の取り組みによって、より良い形式、すなわち、Unicode が策定されました。

Unicode は、あらゆる筆記システムを含む単一文字セットを作成することを目指して作成されたものであり、それまでは多くの国や団体が独自に決定していたため、かなり混沌とした状態であり、少なくとも少し前まではそのような状態が続いていました。具体的な例について興味のある方は、こちらのリンク(英文)を参照してください。

まとめ

世界中の言語を対象にするという前提で策定が進められたことから、言語による相違を認識する文字セットが必要とされました。Unicode では、様々な言語のそれぞれの文字をマッピングし、その 2 進数形式でコンピュータ上の対応する場所を確保できるようにしました。この記事の説明のさらに詳しい解説については、以下にご紹介する参考資料を参照してください。

参考資料

Beal, V. 著(2009 年 9 月 13 日)、「Characters and ASCII Equivalents」、
出典:https://www.webopedia.com/quick_ref/asciicode.asp

Spolsky, J. 著(2003 年 10 月 8 日)、「The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)」、
出典:https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/

Weinand, I. 著、
出典:https://www.bottomupcs.com/index.xhtml

Wikipedia の寄稿者による(2018 年 9 月 24 日)、「Character encoding」(Wikipedia, The Free Encyclopedia)、
出典(2018 年 9 月 28 日 22:16 現在):https://en.wikipedia.org/w/index.php?title=Character_encoding&oldid=860955850