bit列と2進数

12.3. bit列と2進数

文字と整数の翻訳を定めたように コンピュータは整数を扱い、整数は2進数つまり 0, 1 の列であるbit列として認識されます。 2進数は桁数が長くなるため、8 進や16 進数の方が便利なこともあります。もちろん、10進数で表現した方が日常生活では分かりやすいです。

コンピュータの入力は本来bit列ですが、 数 (非負整数) とbit列の対応と数と基本文字の対応を定めたので、 指示を数や文字列で与えることができます。

bit #

01の選択を ビット (bit; binary digit) と呼びます。 実行・キャンセル、有無、真偽など、2つの可能性から 1 つを指定することに相当します。 計算機への指示や扱うデータはビットの並びであるビット列 で表現されます。

まずビット列と数との対応を確認しましょう。同じ数でも複数の表記法があるので、n進数表記のどの表記法かを区別するために \( {\cdots}_{(n)} \) のように下付文字で示します。 次の式は、 \(10\) が、16, 8, 2進表記ではそれぞれ A, 12, 1010 であることを示しています。

\[ 10_{(10)} = \texttt{A}_{(16)} = \texttt{12}_{(8)} = \texttt{1010}_{(2)}\]

nが変わっても、各桁の意味は同じ考え方で理解できることを確認しましょう。

通信量やファイルの大きさの文脈では、 bit列の長さをデータの単位としても使います。8bit を 1byte (バイト) と呼びます。

2進数 #

2進法では 0, 1 の2文字を使います。 2 進法の各位はから順に 1 の位, 2 の位, 4 の位, 8 の位, … と並びます。

たとえば 10という数は、 \(10=8+2=1\cdot 2^3 + 0\cdot 2^2 + 1\cdot 2^1 + 0 \cdot 2^0\) ですから、 2進数では \(\texttt{1010}_{(2)}\) と表記されます。

少し大きな数の例として、 1769 という数を考えます。 \(1769_{(10)} = \texttt{11011101001}_{(2)}\) であることは、以下のように確認できます。

\[\begin{array}{rcl} 1769 &=& 1 \cdot \underbrace{1024}_{2^{10}}+ 1 \cdot \underbrace{512}_{2^9} + 0 \cdot \underbrace{256}_{2^8} + 1 \cdot \underbrace{128}_{2^7} + 1 \cdot \underbrace{64}_{2^6} + 1 \cdot \underbrace{32}_{2^5}\\ && + 0 \cdot \underbrace{16}_{\mathclap{2^4}} + 1 \cdot \underbrace{8}_{\mathclap{2^3}} + 0 \cdot \underbrace{4}_{\mathclap{2^2}} + 0 \cdot \underbrace{2}_{\mathclap{2^1}} + 1 \cdot \underbrace{1}_{\mathclap{2^0}} \end{array}\]
10新表記
1000 100 10 1
数字 1 7 6 9
2新表記
1024 512 256 128 64 32 16 8 4 2 1
数字 1 1 0 1 1 1 0 1 0 0 1
位取り記数法以外の表現

非負整数を 0, 1 の2文字の列で表す方法は、この位取り記数法が唯一の方法ではありません。たとえば Gray code が他の候補です。

Gray code (Wikipedia)

16 進法 #

16 進法では0, 1, …, 9A, B, …, F の16文字を使います。 普段使う0 から 9 だけでは不足し、アルファベットから借りて 10 進法の 10 から 15 をこの順番で A から F に割り当てました。つまり \(\texttt{A}_{(16)} = 10_{(10)},\, \texttt{B}_{(16)} = 11_{(10)},\, \texttt{C}_{(16)} = 12_{(10)},\, \texttt{D}_{(16)} = \texttt{13}_{(10)},\, \texttt{E}_{(16)} = 14_{(10)},\, \texttt{F}_{(16)} = 15_{(10)}\) というわけです。

たとえば

\[1769 = 6 \cdot \underbrace{256}_{16^2} + \underbrace{14}_{\texttt{E}_{(16)}} \cdot 16 + 9 \cdot 1\]

ですから \(1769_{(10)} = \texttt{6E9}_{(16)}\) となります。

2進表記との関係 #

16進表記と2進表記との変換は、10進表記にはせず、直接変換する方が簡単です。 \(16 = 2^4\) ですから、16 進法での 1 桁はちょうど 2 進法での 4 桁に対応します。 従って2進数の 0, 1 の列を下から 4桁ずつに区切り、各4桁を16進数の1文字にしたものが、16進表記になります。

変換表

0から15までの整数の2進表現と16表記を把握しましょう。定義から計算可能です。

2 進法 0000 0001 0010 0011 0100 0101 0110 0111
16 進法 0 1 2 3 4 5 6 7
2 進法 1000 1001 1010 1011 1100 1101 1110 1111
16 進法 8 9 A B C D E F

これまでの例の \(1769_{(10)} = \texttt{11011101001}_{(2)} = \texttt{6E9}_{(16)}\) では

\[\underbrace{110}_{\texttt{6}}\, \underbrace{\texttt{1110}}_{\texttt{E}}\, \underbrace{\texttt{1001}}_{\texttt{9}} {}_{(2)} \]

となります。なお先頭だけ4桁ではなく3桁ですが0が省略されている (leading zero) とみなします。これは日常の10進数でも同じです。

16 進法から 2 進法に読み替える場合は逆に、まず 16 進数の各位を 2 進法の 4 桁の数字読み替えてから、それらを繋げます。

このように簡単に相互変換できることから、2進表現の代わりに、16進表現が多く使われます。人には、桁数の短い16進表現の方が認識しやすいためです。

8進法 #

8進法では 0, 1, …, 7 の8文字を使います。 8 進法の各位はから順に 1 の位, 8 の位, 64 の位, 512 の位, … と並びます。 次の16 進法の方が使われる頻度が高いですが、8 進法もたまに使われます。 8 進法の 1 桁が 2 進法の 3 桁にちょうど対応するので、8 進法と 2 進法との読み替えは簡単にできます。

これまでの例の \(1769_{(10)} = \texttt{3351}_{(8)}\) であることは 以下の2通りの方法で確認できます。

\[1769_{(10)} = \texttt{11011101001}_{(2)} = \underbrace{11}_{\texttt{3}}\, \underbrace{011}_{\texttt{3}}\, \underbrace{\texttt{101}}_{\texttt{5}}\, \underbrace{\texttt{001}}_{\texttt{1}} {}_{(2)} \] \[1769 = 3\cdot \underbrace{512}_{8^3} + 3\cdot \underbrace{64}_{\mathclap{8^2}} + 5\cdot \underbrace{8}_{\mathclap{8^1}} + 1\cdot \underbrace{1}_{\mathclap{8^0}}\]
ASCII bit列と2進数 人のための文字