12.3. bit列と2進数
文字と整数の翻訳を定めたように
コンピュータは整数を扱い、整数は2進数つまり 0
, 1
の列であるbit列として認識されます。
2進数は桁数が長くなるため、8 進や16 進数の方が便利なこともあります。もちろん、10進数で表現した方が日常生活では分かりやすいです。
コンピュータの入力は本来bit列ですが、 数 (非負整数) とbit列の対応と数と基本文字の対応を定めたので、 指示を数や文字列で与えることができます。
bit #
0
か1
の選択を ビット (bit; binary digit) と呼びます。
実行・キャンセル、有無、真偽など、2つの可能性から 1 つを指定することに相当します。
計算機への指示や扱うデータはビットの並びであるビット列 で表現されます。
まずビット列と数との対応を確認しましょう。同じ数でも複数の表記法があるので、n進数表記のどの表記法かを区別するために
\( {\cdots}_{(n)} \)
のように下付文字で示します。
次の式は、
\(10\)
が、16, 8, 2進表記ではそれぞれ A
, 12
, 1010
であることを示しています。
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
, …, 9
と A
, 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進表記になります。
変換表
これまでの例の \(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}} \)