右へ進む十進法、左へ積み上がる二進法
普段使う十進法では、右端から順に一の位、十の位、百の位となり、左へ一桁進むたびに位の重みが10倍になります。二進法も同じ「位取り記数法」ですが、左へ進むたびに重みが2倍になります。右端から順に1、2、4、8、16……の位です。それぞれの桁には0か1だけを書き、その重みを数に含めるかどうかを示します。
たとえば二進数の1011は、8の位と2の位と1の位が1なので、十進数では8+2+1=11です。反対に十進数の13は、8+4+1と分解できるため、二進数では1101になります。同じ1011という並びでも、何進法として読むかを示さなければ値を取り違えることがあります。必要に応じて(1011)₂のように右下へ基数の2を添えると、二進数であることが明確になります。
二進法と十進法は、数そのものが違うのではなく、同じ数を別の記号体系で書いたものです。「十一」という個数を十進法で11、二進法で1011と表しても、表している量は変わりません。
0と1を回路の二つの状態に割り当てる
コンピュータの電子回路では、一定の範囲の電圧を二つの論理状態として区別し、それぞれを0と1に対応させます。実際の電圧が数学的な0や1になるという意味ではありません。電圧には多少の揺れがあっても、二つの範囲のどちらに入るかを判定できれば、論理的な0または1として扱えます。二進法は、このように二つの状態を区別する回路と組み合わせやすい表現です。
0か1の一桁は「ビット」と呼ばれます。複数のビットを組み合わせれば、表せる状態の数が増えます。1ビットなら2通り、2ビットなら00、01、10、11の4通り、8ビットなら256通りです。ビット列に対するAND、OR、NOTなどの論理演算を回路で行うことで、計算や条件判断を組み立てられます。CPUは、こうした回路を多数組み合わせ、命令に従って演算や制御を実行します。
「1+1=10」になる桁上がり
二進法の加算では、使える数字が0と1だけなので、1+1になると一つ上の位へ桁上がりします。そのため、二進数では1+1=10です。これは十進法で9+1=10になるのと同じ位取りの規則です。表記だけを見て十と読むのではなく、「基数と同じ個数に達したら桁を一つ上げる」と考えると理解しやすくなります。
たとえば0111+0001を右端から計算すると、1+1で桁上がりが発生し、その繰り上がりが左へ続いて、結果は1000になります。十進数の7+1=8と同じ計算です。引き算や掛け算にも、十進法と同様に各桁を順に処理する手順があります。違うのは一桁に使える数字と桁上がりの基準であり、計算を小さな手順へ分ける考え方は共通しています。
文字・色・音をビット列にするには規則が要る
ビット列だけを見ても、それが整数、文字、画像、音声のどれを表すのかは決まりません。同じ並びでも、解釈の規則が異なれば別の意味になります。文字には、文字と数値を対応させる文字コードがあります。画像なら各画素の明るさや色を数値で表し、音なら一定の間隔で測った振幅を数値で表します。
現実の連続的な量をコンピュータで扱うときは、測る時点や数値の段階を決め、最後に符号として記録します。この流れが標本化・量子化・符号化です。二進法は記録の土台ですが、データに意味を与えるには、並び方、長さ、解釈方法まで共有する必要があります。その規則がなければ、受け取った側は元の文字や画像を正しく復元できません。
ビット数が決める「何通りまで」の上限
桁数が有限なら、表現できるパターンも有限です。nビットには2のn乗通りの組合せがあります。符号なし整数として解釈する場合、8ビットで表せる範囲は0から255までです。一方、負の数を含める方式では、同じ256通りの一部を負の数へ割り当てるため、表せる範囲が変わります。ビット列だけで符号の有無が自動的に決まるわけではありません。
計算結果が用意された桁数に収まらない現象は、オーバーフローと呼ばれます。また、小数には有限の二進数で正確に表せない値があります。その場合は近い値を保存するため、計算を重ねると丸め誤差が現れることがあります。二進法を使えばあらゆる数を常に正確に保存できる、というわけではありません。
十進数の0.1は二進数では終わらない
十進数の0.1は短く書けますが、二進法に直すと同じ並びが繰り返される循環小数になり、有限桁では正確に書き切れません。反対に、二進数の0.1は2分の1を表すため、十進数では0.5です。小数点以下の位の重みも、左から2分の1、4分の1、8分の1……と半分ずつになります。
この違いは、プログラムで十進小数を計算したとき、見た目には意外な端数が生じる理由の一つです。原因は計算機の故障ではなく、限られたビット数で値を近似する表現方法にあります。金額のように十進での正確さが必要な処理では、最小単位の整数として扱うなど、目的に合う表現を選ぶことが重要です。