banner
寒寒

寒寒

misskey
github

二進数とは何ですか

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 の位」という名前があります。
各桁はそれぞれ10010^010110^110210^210310^3を表します……

数字1394の場合:
「4」は 1 の位にあり、4個の10010^0(1)を表します。
「9」は 10 の位にあり、9個の10110^1(10)を表します。
「3」は 100 の位にあり、3個の10210^2(100)を表します。
「1」は 1000 の位にあり、1個の10310^3(1000)を表します。

合計すると、1×1000+3×100+9×10+4×1=13941\times1000+3\times100+9\times10+4\times1=1394になります。

2 進数も同様の原理です。
2 進数の各桁はそれぞれ202^0212^1222^2232^3を表します……

例えば、2 進数の数字1010の場合
最初の桁の「0」は 0 個の202^0を表します。
2 番目の桁の「1」は 1 個の212^1を表します。
3 番目の桁の「0」は 0 個の222^2を表します。
4 番目の桁の「1」は 1 個の232^3を表します。
すべてを合計すると、0×20+1×21+0×22+1×23=100\times2^0+1\times2^1+0\times2^2+1\times2^3=10になります。

2 進数の部分では、私は「1 の位」、「10 の位」とは言わず、**「1 番目の位」、「2 番目の位」** と言ったことに気づくかもしれません。これは「1 の位」、「10 の位」という呼び方自体が 10 進数に関連しているため、2 進数の桁を説明するためには使用できないからです。

実践#

さて、10 進数と 2 進数で 1 から数えて、先ほどの知識を確認してみましょう。

  1. まずは 1 です。この数字は 10 進数と 2 進数で同じなので、スキップします。

  2. 次に 10 進数の 2 です。先ほど説明したように、2 進数は「2 で満たすと 1 進む」ため、最下位を 0 にし、次の位を 1 増やします。つまり10になります。

  3. 10 進数の 3 はどうでしょう?簡単です。あなたも理解できるはずです。11です。

  4. 10 進数の 4 に達すると、明らかに 1 を加えると最下位が 2 になります。したがって、最下位を 0 にし、次の位を 1 増やします。しかし、次の位はもともと 1 です。どうすればいいのでしょうか?明らかに、次の位も 0 にし、3 番目の位を 1 増やす必要があります。最終的に100になります。

これは 3 から 4 に数える全プロセスです:

3 番目の位2 番目の位最下位説明
011元の数 3
011+11 を加える
01+10最下位が 2 になったので、0 にし、次の位を 1 増やす
0+100次の位も 2 になったので、0 にし、次の位、つまり 3 番目の位を 1 増やす
100最終的に 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-00007F0xxxxxxx
000080-00007FF110xxxxx 10xxxxxx
000800-00FFFF1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF11110xxx 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 進数には2×14=282\times14=28枚のカードが必要です。
3 進数には3×9=273\times9=27枚のカードが必要です。
5 進数には5×6=305\times6=30枚のカードが必要です。
10 進数には10×4=4010\times4=40枚のカードが必要です。
16 進数には16×4=6416\times4=64枚のカードが必要です。

もちろん、このプロセスでは「リソースの浪費」が発生し、一部のカードは実際には 9999 (10) の上限を超える数を表現できます。

したがって、x 進数で n 個の数を表現する際に必要なカードの枚数を正確に計算するためには、n 個の数を表現する際の「理論桁数」を求め、それに単一の桁に必要なカードの枚数 x を掛ける必要があります。

「理論桁数」とは何でしょうか?前述の例では、3 進数が 9999 (10) を表現するのに 9 桁必要なのは、log399998.3835log_{3}9999\approx8.3835であり、これを切り上げて 9 になります。また、5 進数が 6 桁必要なのは、log599995.7226log_{5}9999\approx5.7226であり、これを切り上げて 6 になります。この切り上げのプロセスが、前述の「リソースの浪費」です。そして、5.7726、8.3835(近似値)が私たちが言う「理論桁数」です。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。