前回、パソコンは「電圧がかかっているか、いないか」の2状態しか区別できないためデジタル機器になる、という話をした。
今回は、その2状態だけを使ってどうやって数値を表現しているのか、2進数の仕組みを見ていく。
トランジスタとビット

パソコンの内部で情報を記憶している主役はトランジスタという半導体素子だ。トランジスタは電圧がかかっている状態とかかっていない状態の2つしか保持できない。この2つの状態に、数値の1と0を割り当てることで、パソコンは情報を記憶できるようになる。
このとき、1個のトランジスタが記憶できる最小単位をビット(bit)と呼ぶ。これは「binary digit(2進数字)」を縮めた造語で、bi-とdigitをつなげて省略した言葉だ。1ビットは0か1のどちらか一方しか表せないが、これを8個まとめるとバイト(byte)という単位になり、0〜255の256通りの値を表現できるようになる。
10進数のおさらいから
2進数を理解する近道は、普段使っている10進数の仕組みを分解して見直すことだ。
「347」という数字は、実は「300」「40」「7」を足し合わせたものであり、それぞれ10の累乗(10², 10¹, 10⁰)に対応する桁の値を掛けて合計したものと言い換えられる。
10進数では各桁に0〜9の10種類の数字を使えるため「10進」と呼ばれる。10進(decimal)という言葉自体、ラテン語で「10」を意味するdecimに由来する。
2進数は考え方が同じ、使える数字が2つだけ
2進数の仕組みは10進数とまったく同じで、違うのは各桁が2の累乗を表す点と、使える数字が0と1の2種類しかない点だけだ。
たとえば2進数の1101は、次のように計算できる。
つまり2進数の1101は、10進数の13にあたる。1が立っている桁の値だけを足し合わせる、という考え方をすると理解しやすい。
2の累乗を頭に入れておく
10進数を2進数に変換する作業は、対象の数値を2の累乗の値で次々に引き算していく作業だと考えるとやりやすい。そのために、最低限8つの数値は暗記しておく。
| 2の累乗 | 計算 | 10進数での値 |
|---|---|---|
| 2⁰ | 1 | 1 |
| 2¹ | 2×1 | 2 |
| 2² | 2×2 | 4 |
| 2³ | 2×2×2 | 8 |
| 2⁴ | 2×2×2×2 | 16 |
| 2⁵ | 2×2×2×2×2 | 32 |
| 2⁶ | 2×2×2×2×2×2 | 64 |
| 2⁷ | 2×2×2×2×2×2×2 | 128 |
たとえば10進数の90を2進数に変換したいなら、90を超えない最大の2の累乗は64(2⁶)なので、まずその桁を1にする。
90 − 64 = 26が残るので、次に 26 を超えない最大の 2 の累乗である 16(2⁴) を引く。 26−16=10。
続いて10を超えない最大の2の累乗は 8(2³)で、10 − 8 = 2。最後に残った2はそのまま 2¹ にあたる。
これで 64+16+8+2 = 90 となり、2進数では 1011010 と表せる。
90 の 2 進数変換の過程を表にすると、次のようになる。
| 桁 (2の累乗) | 判定 | 引き算 | この桁の値 |
|---|---|---|---|
| 2⁶ (64) | 90 ≧ 64 | 90 − 64 = 26 | 1 |
| 2⁵ (32) | 26 < 32 | なし | 0 |
| 2⁴ (16) | 26 ≧ 16 | 26 − 16 = 10 | 1 |
| 2³ (8) | 10 ≧ 8 | 10 − 8 = 2 | 1 |
| 2² (4) | 2 < 4 | なし | 0 |
| 2¹ (2) | 2 ≧ 2 | 2 − 2 = 0 | 1 |
| 2⁰ (1) | 0 < 1 | なし | 0 |
上から順に値を並べると 1011010 となり、これが10進数の90を2進数で表したものになる。各桁で「その2の累乗以上の値が残っているか」を判定し、残っていれば1を立てて引き算を進め、残っていなければ0のまま次の桁に進む、という単純な繰り返しであることがこの表からわかる。
もっと機械的な変換方法
2の累乗を覚えなくても2進数に変換できる方法がある。数値を2で割り続け、その余りを記録していくやり方だ。
手順はこうだ。変換したい数値を 2 で割り、商と余りを求める。その商をさらに 2 で割り、また余りを求める。これを商が 0 になるまで繰り返す。最後に、出てきた余りを下から上に向かって並べると、それがそのまま2進数になる。
90で試すと、次のようになる。
| 計算 | 商 | 余り | 対応する桁 |
|---|---|---|---|
| 90 ÷ 2(90/2¹) | 45 | 0 | 2⁰ |
| 45 ÷ 2(90/2²) | 22 | 1(2, 2¹) | 2¹ |
| 22 ÷ 2(88/2³) | 11 | 0 | 2² |
| 11 ÷ 2(88/2⁴) | 5 | 1(8,2³) | 2³ |
| 5 ÷ 2 (80/2⁵) | 2 | 1(16, 2⁴) | 2⁴ |
| 2 ÷ 2 (64/2⁶) | 1 | 0(2⁵) | 2⁵ |
| 1 ÷ 2 (64/2⁷) | 0 | 1(64, 2⁶) | 2⁶ |
一番上の行の余り 0 が2⁰の桁、次の行の余り 1 が2¹の桁というように、下に進むほど大きい桁の値になっていく。余りを下から上に読むと1011010となり、以前に2の累乗を引き算していった方法とまったく同じ結果になる。
商と余りが何を意味しているか
この計算がなぜ成り立つのか、商と余りそれぞれの意味に立ち返ると見えてくる。
商そのものは答えではなく、次の桁を調べるための新しい「残りの値」にあたる。1回の割り算が終わるたびに、この商が次のステップの出発点になる。
余りは、今調べている桁(2⁰、2¹、2²…)が実際に使われているかどうかを示す。余りが0ならその桁は0、余りが出ればその桁は1だ。
割る数が 2ᵏ のとき、そこで出てくる余りは 0 か 2ᵏ⁻¹ のどちらかしかない。割る数2³(=8)なら、余りは0か2²(=4)のどちらか。割る数2⁴(=16)なら余りは0か2³(=8)、割る数2⁵(=32)なら余りは0か2⁴(=16)、という具合にひとつずつずれていく。
つまりこの計算は、元の値を「2⁰の桁は使われているか」「2¹の桁は使われているか」と、小さい桁から順に一つずつ確認していく作業になっている。ある桁が使われていれば、その分の重みが余りとして取り出され、残りの値から差し引かれる。これを繰り返すことで、残りの値は少しずつ小さくなっていき、最終的に商が0になった時点で、それより上の桁はすべて0だと確定する。
最後に、下の桁から順に求めてきた余りを、求めた順とは逆に上から下へ並べ直すと1011010となり、90を2進数で表した値になる。
2の累乗(64、32、16…)を暗記していなくても、ひたすら2で割って余りを記録するだけで答えが出せるのがこの方法の利点だ。桁数が多い数値では割り算の回数も増えるが、機械的な繰り返し作業で済むぶん、間違えにくい。
なぜわざわざ2進数なのか
11011010のような並びは347よりも桁数が多く、一見不便に見えるかもしれない。しかしパソコンは1と0以外の値を記憶する手段を持たない以上、この方式を使うしかない。
逆に言えば、単純な2状態の組み合わせだけであらゆる数値やデータを表現できる、というのが2進数の強みでもある。
次回は、2進数と同じくパソコンでよく登場するもう一つの進法、16進数について見ていく。



