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 |
位取り記数法以外の表現
非負整数を
Gray code (Wikipedia)0
,1
の2文字の列で表す方法は、この位取り記数法が唯一の方法ではありません。たとえば Gray code が他の候補です。
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進表記になります。
変換表
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}}\]