2 進数とは#
はじめに#
私たちは子供の頃から数を数えることができます。
1、2、3、4、5、6、7、8、9、10、11、12……
知能が正常な人なら誰でも無限に数え続けることができます。
しかし、数字はこのようにしか表現できないと思ったことはありますか?
次に、別の数え方を試してみましょう。
1、10、11、100、101、110、111、1000、1001、1010、1011、1100……
少し混乱するかもしれませんが、これが 1~12 の 2 進数での表現です。
この記事を読み終えたら、あなたは完全に理解できると信じています。
この記事は数の体系から始まり、2 進数とは何か、なぜ 2 進数を使用するのか、1 と 0 から成る 2 進数がどのように私たちのコンピュータ内のテキスト、画像、動画に変わるのかを説明しています。記事は長いですが、根気よく読み終えれば、何かを得られると信じています。
数字#
ほとんどの人は生まれつき2 本の手を持ち、それぞれの手には5 本の指があります。
幼少期の頃、私たちは指を使って数を数え始めました。
人は通常10 本の指しか持っていませんが、10 より大きな数を表現したい場合はどうすればよいのでしょうか?
あなたは「それは簡単だ、数字を使えばいい」と言うでしょう。
古代の人々も同じ考えを持っていたため、さまざまな記号を作り出して「数」を表現しました。
現在、私たちが最もよく使うのはアラビア数字です。
進数と数字#
進数#
小学校の先生が教えてくれたように、アラビア数字は「10 で満たすと 1 進む」、つまり 10 に達するたびに現在の桁を 0 にし、次の桁を 1 増やします。
これが進数です。
満何で 1 進むかがその進数です。
例えばアラビア数字では、0 から 9 まで数えた後、次の数字は新しい数字ではなく、十の位に 1 を書き、1 の位に 0 を書く、つまり 10 になります。これが10 進数であり、ほとんどの人が日常的に使用する進数です。
2 進数は「2 で満たすと 1 進む」、つまり 2 に達するたびに現在の桁を 0 にし、次の桁を 1 増やします。したがって、10 進数が 10 の数字を持つのに対し、2 進数は2 つの数字、0 と 1しかありません。
「位」の意味#
10 進数では、数字の各桁には「1 の位」、「10 の位」、「100 の位」、「1000 の位」という名前があります。
各桁はそれぞれ、、、を表します……
数字1394
の場合:
「4」は 1 の位にあり、4個の(1)を表します。
「9」は 10 の位にあり、9個の(10)を表します。
「3」は 100 の位にあり、3個の(100)を表します。
「1」は 1000 の位にあり、1個の(1000)を表します。
合計すると、になります。
2 進数も同様の原理です。
2 進数の各桁はそれぞれ、、、を表します……
例えば、2 進数の数字1010
の場合
最初の桁の「0」は 0 個のを表します。
2 番目の桁の「1」は 1 個のを表します。
3 番目の桁の「0」は 0 個のを表します。
4 番目の桁の「1」は 1 個のを表します。
すべてを合計すると、になります。
2 進数の部分では、私は「1 の位」、「10 の位」とは言わず、**「1 番目の位」、「2 番目の位」** と言ったことに気づくかもしれません。これは「1 の位」、「10 の位」という呼び方自体が 10 進数に関連しているため、2 進数の桁を説明するためには使用できないからです。
実践#
さて、10 進数と 2 進数で 1 から数えて、先ほどの知識を確認してみましょう。
-
まずは 1 です。この数字は 10 進数と 2 進数で同じなので、スキップします。
-
次に 10 進数の 2 です。先ほど説明したように、2 進数は「2 で満たすと 1 進む」ため、最下位を 0 にし、次の位を 1 増やします。つまり10になります。
-
10 進数の 3 はどうでしょう?簡単です。あなたも理解できるはずです。11です。
-
10 進数の 4 に達すると、明らかに 1 を加えると最下位が 2 になります。したがって、最下位を 0 にし、次の位を 1 増やします。しかし、次の位はもともと 1 です。どうすればいいのでしょうか?明らかに、次の位も 0 にし、3 番目の位を 1 増やす必要があります。最終的に100になります。
これは 3 から 4 に数える全プロセスです:
3 番目の位 | 2 番目の位 | 最下位 | 説明 |
---|---|---|---|
0 | 1 | 1 | 元の数 3 |
0 | 1 | 1+1 | 1 を加える |
0 | 1+1 | 0 | 最下位が 2 になったので、0 にし、次の位を 1 増やす |
0+1 | 0 | 0 | 次の位も 2 になったので、0 にし、次の位、つまり 3 番目の位を 1 増やす |
1 | 0 | 0 | 最終的に 100 になります |
まとめ#
2 進数は実際にはそれほど難しくなく、核心的な考え方は「2 で満たすと 1 進む」です。このことを理解すれば、普段の数え方と同じように、簡単に 2 進数で数えることができるようになります。
なぜ 2 進数を使用するのか#
私の文章を読んでいる人は、コンピュータについてある程度の理解があると思います。
簡単に言えば、コンピュータのプロセッサは回路で構成されており、回路内では、通電(または高電圧、オン)が 1 を表し、通電しない(または低電圧、オフ)が 0 を表します。実装は非常に簡単です。
また、論理的には、「真」と「偽」の 2 つの状態もちょうど 1 と 0 で表現できます。
コンピュータにおける 2 進数の具体的な実装#
はじめに#
コンピュータでは、すべての文字、画像、動画、ウェブページ、文書、ソフトウェアは、コンピュータの目には単なる 0 と 1 から成る 2 進データとして見えます。
バイトとビット#
コンピュータ内の 2 進データは通常 8 ビットの 2 進数で区切られるため、8個の 2 進数字は 1 つのバイトと呼ばれ、1 つの 2 進数字は 1ビットと呼ばれます。
コーディング#
テキスト、音声、画像などの情報を処理する際、コンピュータはこれらの情報を 2 進数字に変換して処理する必要があります。このプロセスをコーディングと呼びます。
文字コーディング#
概要#
テキストが 2 進数で表現される方法について話すと、文字コーディングを避けて通ることはできません。文字コーディングは 2 進数と文字の対応関係であり、コンピュータが特定の 2 進数字を文字に変換したり、文字を 2 進数に変換したりすることを可能にします。文字コーディングの核心的な考え方はそれほど複雑ではなく、辞書のような表であり、コンピュータは変換プロセスで文字ごとに表を参照するだけです。
一般的な文字コーディングにはASCII、GBK、GB2312、Unicodeなどがあります。
文字コーディングの歴史と一般的な文字コーディング#
ASCII#
コンピュータはアメリカ人によって発明され、彼らがコンピュータを発明したとき、彼らは自分たちの 26 の英字を表に入れることだけを考えていました。大文字と小文字のアルファベット、さらに数字と句読点(実際には改行、キャリッジリターン、タブなどの制御文字も含まれます)を含め、7 ビットの 2 進数(10 進数の最大値は 127)で十分でした。さらに 1 ビットを予約し、ちょうど 1 バイト(8 ビット)になりました。余分な 1 ビットは、後にヨーロッパのアクセント付き文字によって占有されました。これがASCII(アメリカ情報交換標準コード)です。
中国語コーディング#
コンピュータが中国に伝わると、中国人は 1 バイトでは漢字を表現するには不十分だと考え、大陸では簡体字を表現するためのGB2312を作成しました。これは 2 バイトを使用して 6763 の一般的な漢字(第 1 水準 3755 字、第 2 水準 3008 字を含む)を表現します。台湾では繁体字を表現するためのBig5(大五码)が作成され、13060 の漢字を収録し、同様に 2 バイトで 1 つの漢字を表現します。その後、大陸では GB2312 の「上位版」としてGBKが登場し、GB2312 の標準に多くの珍しい漢字やその他の文字を追加し、合計で 2 万以上の漢字を含むが、同様に 2 バイトで保存されます。
Unicode#
その後、中国には中国のコーディング、アメリカにはアメリカのコーディング、日本には日本のコーディング、ヨーロッパにはヨーロッパのコーディングがあり…… ついに、コンピュータ界の大物が拍手をしてUnicodeを作り出しました。Unicode は uni という接頭辞(「一」「統一」を意味する)と code(「コーディング」を意味する)を組み合わせた言葉です。これは Unicode の核心理念が世界中のすべての言語の文字を含み、すべてのコーディングを統一し、最終的に世界共通のコーディングになることを意味します。幸運なことに、彼らはそれを実現しました。2021 年 9 月 14 日に発表されたUnicode14.0標準では、Unicode は合計 144967 の文字を含み、見たことがあるもの、ないもの、知っているもの、知らないもの、誰かが使っているもの、誰も使っていないもの…… さまざまな言語の文字を含んでおり、もちろん emoji も含まれています。
UTF-8(可変長コーディング)#
以前に述べたように、中国語のコーディングはほとんどが 2 バイトであるのは、2 バイトで最大 65535 の文字を表現できるからです。GB2312 の 6763 文字や GBK の 2 万以上の文字も余裕で収容できますが、Unicode 時代には理論的には 4 バイトが必要です。しかし、賢い人が可変長コーディングというものを考案しました。これは異なる文字に応じて異なる長さのデータを保存でき、コンピュータが正確に分割できることを保証します。例えば、英字は 1 バイト、中国語は 3 バイト、emoji は 4 バイトです。(ここで中国語が 1 バイト多いのは、可変長コーディング自体が一定のスペースを浪費する必要があるためですが、すべての文字を 4 バイトで保存するよりはるかに良いです)
可変長コーディングが具体的にどのように実現されるかを知りたい場合は、以下の表を見てください。
Unicode コーディング(16 進数) | UTF-8 バイトストリーム(二進数) |
---|---|
000000-00007F | 0xxxxxxx |
000080-00007FF | 110xxxxx 10xxxxxx |
000800-00FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
010000-10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
表の左側は文字の Unicode16 進数コーディング、右側は二進データで、x は実際に使用されるデータを示し、残りの部分は可変長コーディングの実装メカニズムによって占有されています。
以前に述べたように、可変長コーディングの利点は、各文字が異なる長さの二進データで保存されても、コンピュータが一連の二進数字の中から各文字を正確に分割できることです。それはどのように実現されるのでしょうか?
非常に簡単です。表の右側を見てください。各 Unicode コーディング範囲に対応する二進データの先頭は、0 または 1 の束と 0 の組み合わせです。コンピュータは依然としてバイト単位で読み取り、各バイトの先頭にある 1 の数に応じて、その文字が何バイトを占めるかを判断します。
可変長コーディングの登場により、Unicode の最大の弱点である「スペースを占有する問題」が解消され、Unicode は世界中で普及し、コンピュータ界の「理想的なコーディング」となりました。
画像、動画、音声のコーディング#
画像コーディング#
画像のコーディング方式には主に 2 つの種類があります:無損失コーディングと有損失コーディング。無損失コーディング方式は画像のすべての情報を保持できますが、ファイルは通常大きくなります。一般的な無損失コーディング方式には GIF や PNG があります。有損失コーディング方式は、ファイルサイズを圧縮するために一部の情報を犠牲にします。一般的な有損失コーディング方式には JPEG があります。
コンピュータでは、画像はピクセルの配列として保存されます。各ピクセルは赤、緑、青の 3 つの色チャネルの輝度値で構成されています。GIF や PNG のような無損失コーディング方式では、各ピクセルの値が個別にコーディングされます。一方、JPEG のような有損失コーディング方式では、ピクセルを周波数領域の変換係数に変換してコーディングします。
動画コーディング#
動画のコーディング方式も通常は有損失コーディング方式を採用し、動画ファイルのサイズを圧縮します。一般的な動画コーディング標準には MPEG-1、MPEG-2、MPEG-4、H.264、H.265 などがあります。その中で、MPEG-2 は DVD 用の標準であり、MPEG-4 はさまざまなストリーミングアプリケーションで広く使用されています。
動画コーディングのプロセスは主に 2 つのステップから成ります:空間予測と変換コーディング。空間予測では、各フレームのピクセル値は前のフレームのピクセル値を基に予測されます。これにより、各フレームでコーディングする必要がある情報量が大幅に削減されます。変換コーディングでは、JPEG に似た変換ベースのコーディング方式を採用し、各フレームのピクセル値を周波数領域の変換係数に変換してコーディングします。
音声コーディング#
音声コーディング方式も通常は有損失コーディング方式を採用し、音声ファイルのサイズを圧縮します。一般的な音声コーディング標準には MP3、AAC、WMA などがあります。その中で、MP3 は最も人気のある音声コーディングフォーマットの 1 つであり、圧縮率は 10:1 またはそれ以上に達することができます。
音声コーディングのプロセスは主に 2 つのステップから成ります:時間周波数変換とエントロピーコーディング。時間周波数変換では、音声信号を時間領域と周波数領域に変換し、信号をより良く圧縮します。エントロピーコーディングでは、信号の統計的特性に基づいて、より効率的なコーディング方式を使用して信号をコーディングします。
拡張読書#
その他の進数のコンピュータ#
実際、コンピュータが発明された初期には、10 進数や 3 進数のコンピュータも存在しました。
例えば、世界初の汎用コンピュータ ENIAC は 10 進数でした。
また、旧ソ連では 3 進数のコンピュータСетуньが製造され、異なる室温で驚異的な信頼性と安定性を示し、製造とメンテナンスも当時の他のコンピュータよりもはるかに容易でした。しかし、その後…… ソ連の官僚はこの経済計画外の SF 産物に否定的な態度を取り、生産を中止するよう命じました。その時、Сетуньへの注文は雪のように舞い込んできましたが、年間 30〜50 台の生産量では市場の需要に応えるには不十分でした。
すぐに、Сетуньの共同生産を計画していた工場は閉鎖されました。1965 年、Сетуньは生産を停止しました。その代わりに 2 進数のコンピュータが登場しましたが、価格は 2.5 倍も高くなりました。
最終的に、この非常に有望なコンピュータは抑圧されました……
なぜ 3 進数を使用するのか#
実際、理論的には e 進数が最もストレージ効率の良い進数ですが、e は無理数で実現が難しいため、3 が e に最も近いので 3 進数が使用されました。
数学的な証明については…… 少し複雑ですので、興味があれば次のセクションを見てください。
私たちが知っておくべきことは、3 進数が最小のストレージスペースでより多くのデータを保存できるということです。
進数効率の詳細#
このセクションでは、m 進数 x を x (m) と表します。
まず、例を挙げましょう。
仮に、2、3、5、10、16 進数で 10 進数 0-9999 の 10000 個の数字を表現する場合、各進数には何桁必要でしょうか?
10011100001111(2)=9999(10)
したがって、2進数には14桁が必要です。
111201100(3)=9999(10)
したがって、3進数には9桁が必要です。
304444(5)=9999(10)
したがって、5進数には6桁が必要です。
9999(10)=9999(10)
したがって、10進数には4桁が必要です。
270F(16)=9999(10)
したがって、16進数には4桁が必要です。
仮に、これらの数をカードで表現する場合、各進数には何枚のカードが必要でしょうか?
例えば:5 進数には 0,1,2,3,4 の 5 つの数字があるため、1 桁の 5 進数を表現するには 5 枚のカードが必要です。つまり、1 桁の n 進数には n 枚のカードが必要です。
単純な掛け算を行うことで次のように求められます:
2 進数には枚のカードが必要です。
3 進数には枚のカードが必要です。
5 進数には枚のカードが必要です。
10 進数には枚のカードが必要です。
16 進数には枚のカードが必要です。
もちろん、このプロセスでは「リソースの浪費」が発生し、一部のカードは実際には 9999 (10) の上限を超える数を表現できます。
したがって、x 進数で n 個の数を表現する際に必要なカードの枚数を正確に計算するためには、n 個の数を表現する際の「理論桁数」を求め、それに単一の桁に必要なカードの枚数 x を掛ける必要があります。
「理論桁数」とは何でしょうか?前述の例では、3 進数が 9999 (10) を表現するのに 9 桁必要なのは、であり、これを切り上げて 9 になります。また、5 進数が 6 桁必要なのは、であり、これを切り上げて 6 になります。この切り上げのプロセスが、前述の「リソースの浪費」です。そして、5.7726、8.3835(近似値)が私たちが言う「理論桁数」です。