基礎●○○○○

2進数

にしんすう

0と1の2種類の数字で数を表す方法。コンピュータのすべての情報表現の土台。

概要

2進数は、0と1のたった2種類の数字だけで数を表す方法です。私たちが日常で使う10進数が「0〜9の10種類の数字を使い、10集まると桁が上がる」のに対し、2進数は「0と1の2種類だけを使い、2集まると桁が上がる」数え方です。たとえば10進数の5は、2進数では101と書きます。

なぜこれがコンピュータの世界で最重要なのかというと、コンピュータの内部にあるすべての情報 — 数値も、文字も、画像も、音声も、プログラムそのものも — が最終的にはこの0と1の列として記録・処理されているからです。この0か1かの最小単位を「ビット(bit)」と呼び、8ビットをひとまとめにした単位を「バイト(byte)」と呼びます。ファイルサイズの「KB」「MB」、メモリの「16GB」といった日常的に目にする単位は、すべてこのバイトの積み重ねです。

2進数そのものを手で計算する機会は実務では多くありません。しかしIPアドレスのサブネット計算、権限フラグの読み方、桁あふれによるバグなど、あちこちで「下に2進数が敷かれている」場面に出会います。土台として一度きちんと理解しておくと、後のさまざまな語彙の見通しが良くなります。

なぜ生まれたか

コンピュータが2進数を採用したのは、数学的な美しさのためではなく、物理的な都合のためです。コンピュータの内部では、情報は電圧の高い/低い、スイッチのON/OFFといった電気的な状態で保持されます。もし10進数をそのまま扱おうとすると、1本の信号線で10段階の電圧を正確に区別しなければなりません。電圧はノイズや温度でわずかに揺らぐため、10段階の区別は誤読のもとになります。

一方、「電圧が高いか低いか」の2択なら、多少ノイズが乗っても判定を間違えにくく、回路も単純に作れます。信頼性と製造しやすさを取って「1本の線では2状態だけを表し、代わりに線をたくさん並べて桁数を稼ぐ」— これが2進数コンピュータの基本設計です。初期には10進数で動くコンピュータも実在しましたが、回路の単純さで勝る2進数方式が主流となり、現在に至ります。

詳細

桁の重みで読む

10進数の「352」が「100が3個、10が5個、1が2個」を意味するように、2進数も各桁に重みがあります。ただし重みは10倍ずつではなく2倍ずつ、右から 1, 2, 4, 8, 16, 32, 64, 128… と増えていきます。たとえば2進数の 11001010 は、重み128・64・8・2の桁が1なので、128 + 64 + 8 + 2 = 202 と読めます。

8ビット(=1バイト)で表せるのは 00000000〜11111111、10進数でいえば0〜255の256通りです。IPアドレス(IPv4)が「192.168.0.1」のように0〜255の数を4つ並べた形をしているのは、まさに「1バイトを4つ並べた32ビットの値」だからです。

16進数 — 2進数の速記法

2進数は桁数がすぐ長くなり、人間には読み書きしづらいという弱点があります。そこで実務では、2進数4桁をちょうど1文字で表せる16進数(0〜9とA〜Fの16種類の文字を使う数え方)が速記法として使われます。4ビットは16通りなので、2進数を右から4桁ずつ区切って置き換えるだけで機械的に変換できます。

桁の重み12864321684212進数1100101016進数CA1100 = 12 = C1010 = 10 = A10進数 202 = 128 + 64 + 8 + 2 = 16進数 0xCA
同じ値202の3つの表記 — 2進数を4桁ずつ区切ると16進数に対応する

メモリダンプやハッシュ値、カラーコード(#FF5733)などが16進数で書かれるのは、この「2進数との相性の良さ」が理由です。「16進数の2文字 = 1バイト」という対応を覚えておくと、ハッシュ値の長さ(SHA-256なら16進数64文字 = 32バイト = 256ビット)なども即座に読み解けるようになります。

桁あふれと符号 — ビット数には上限がある

紙の上の数と違い、コンピュータの数値には「何ビットで表すか」という器の大きさが決まっています。8ビットの器で255(11111111)に1を足すと、繰り上がった9桁目は器からこぼれ落ち、結果は0に戻ってしまいます。これが「桁あふれ(オーバーフロー)」で、カウンタが突然0や負の値に化けるバグの正体です。2038年問題(32ビットで秒を数えてきたUNIX時刻があふれる)も同じ構造の問題です。

負の数は「2の補数」という表現で扱われます。細部を覚える必要はありませんが、「最上位ビットが符号の役割を持ち、同じ8ビットでも符号付きなら −128〜127、符号なしなら 0〜255 と解釈が変わる」ことだけ押さえておいてください。同じビット列 11111111 が、符号なしでは255、符号付きでは−1と読まれる — 「ビット列そのものに意味はなく、解釈の規則が意味を与える」という感覚が、2進数理解の核心です。

ここまでの内容 — 桁の重み・16進数との対応・桁あふれ・符号の解釈 — は、実際にビットを触ってみるのが一番の近道です。

⚡ 体験: ビットを直接いじって数を作る
10進202(0〜255)
16進0xCA
2進1100 1010
128 + 64 + 8 + 2 = 202

ビットをクリックして0/1を切り替えてみてください。立っている桁の重みの和が10進数の値になります。

すべては解釈次第 — 実務で顔を出す場面

この「解釈が意味を与える」という原則は、そのまま他の語彙への入口になります。ビット列を小数として解釈する規則が浮動小数点、文字として解釈する規則が文字コードです。文字化けとは、ビット列を書いたときと違う規則で読んでしまう事故にほかなりません。また、ビット列を数ではなく「フラグの集まり」として直接操作するのがビット演算で、IPアドレスのサブネットマスクやファイル権限(Unixの755など)で実際に使われています。

普段は高級言語やライブラリがこの層を隠してくれますが、数値が突然おかしくなったとき、バイナリファイルを覗くとき、ネットワークのビットを数えるとき — 抽象の底が抜けたときに立ち返る場所が、この2進数です。