数と表現
私たちが日常使っている数は0〜9の10種類の数字で表す10進数です。しかし、コンピュータの内部では電気信号の「ON / OFF」、つまり0と1の2種類だけで情報を扱います。この章では、コンピュータが数をどのように表現するかを学びます。
基数とn進数
Section titled “基数とn進数”数を表すときに使う数字の種類の数を基数(きすう)と呼びます。私たちが普段使う10進数は基数が10、コンピュータが使う2進数は基数が2です。
| n進数 | 基数 | 使用する数字 | 主な用途 |
|---|---|---|---|
| 2進数 | 2 | 0, 1 | コンピュータ内部のデータ表現 |
| 8進数 | 8 | 0〜7 | ファイルのアクセス権限(Unix系OS)など |
| 10進数 | 10 | 0〜9 | 日常生活の計算 |
| 16進数 | 16 | 0〜9, A〜F | メモリアドレス、カラーコード(#FF0000)など |
16進数では、10〜15に対応する数字としてA〜Fのアルファベットを使います。
| 10進数 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|
| 16進数 | A | B | C | D | E | F |
異なるn進数の間で数を変換することを基数変換と呼びます。基数変換はITパスポート試験で非常に頻出のテーマです。
2進数 → 10進数
Section titled “2進数 → 10進数”2進数の各桁は、右から順に2の0乗、2の1乗、2の2乗…の重みを持ちます。各桁の値に重みを掛けて合計すれば10進数に変換できます。
たとえば、2進数の 1011 を10進数に変換してみましょう。
| 桁の位置 | 左から1桁目 | 左から2桁目 | 左から3桁目 | 左から4桁目 |
|---|---|---|---|---|
| 桁の値 | 1 | 0 | 1 | 1 |
| 重み | 2³ = 8 | 2² = 4 | 2¹ = 2 | 2⁰ = 1 |
| 桁の値 × 重み | 8 | 0 | 2 | 1 |
8 + 0 + 2 + 1 = 11(10進数)
10進数 → 2進数
Section titled “10進数 → 2進数”10進数を2で繰り返し割り、その余りを下から上に並べると2進数になります。
たとえば、10進数の 155 を2進数に変換してみましょう。
| 割り算 | 商 | 余り |
|---|---|---|
| 155 ÷ 2 | 77 | 1 ← 最下位ビット |
| 77 ÷ 2 | 38 | 1 |
| 38 ÷ 2 | 19 | 0 |
| 19 ÷ 2 | 9 | 1 |
| 9 ÷ 2 | 4 | 1 |
| 4 ÷ 2 | 2 | 0 |
| 2 ÷ 2 | 1 | 0 |
| 1 ÷ 2 | 0 | 1 ← 最上位ビット |
余りを下から読むと 10011011 → 10進数の155は2進数で 10011011 です。
2進数 ↔ 16進数
Section titled “2進数 ↔ 16進数”2進数と16進数の変換は簡単です。2進数を4桁ずつ区切り、それぞれを16進数の1桁に対応させます。
| 2進数(4桁) | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
|---|---|---|---|---|---|---|---|---|
| 16進数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 2進数(4桁) | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
|---|---|---|---|---|---|---|---|---|
| 16進数 | 8 | 9 | A | B | C | D | E | F |
たとえば、2進数 10011011 を16進数に変換するには、右から4桁ずつ区切ります。
1001 1011 → 9 B → 9B(16進数)
逆に、16進数 9B を2進数にするには各桁を4桁の2進数に展開します。
9 → 1001、B → 1011 → 10011011(2進数)
2進数 ↔ 8進数
Section titled “2進数 ↔ 8進数”2進数を3桁ずつ区切り、それぞれを8進数の1桁に対応させます。
たとえば、2進数 10011011 を8進数に変換するには、右から3桁ずつ区切ります。
10 011 011 → 2 3 3 → 233(8進数)
試験で出るポイント
2進数の加算
Section titled “2進数の加算”2進数の加算(足し算)は、10進数と同じ筆算の要領で行いますが、1 + 1 = 10(繰り上がり)という点が異なります。
2進数の加算規則は次のとおりです。
| 計算 | 結果 |
|---|---|
| 0 + 0 | 0 |
| 0 + 1 | 1 |
| 1 + 0 | 1 |
| 1 + 1 | 10(0を書いて1を繰り上げ) |
| 1 + 1 + 1 | 11(1を書いて1を繰り上げ) |
たとえば、1011(10進数で11)+ 0110(10進数で6)を計算してみましょう。
1 0 1 1+ 0 1 1 0----------- 1 0 0 0 1結果は 10001(10進数で17)となり、11 + 6 = 17 と一致します。
2進数の減算と補数
Section titled “2進数の減算と補数”2進数の減算(引き算)は、補数(ほすう)を使って加算に置き換える方法が重要です。コンピュータは内部的に減算を行う回路を持たず、補数を使った加算で代用しています。
2の補数とは、ある2進数の各ビットを反転(0→1、1→0)し、その結果に1を加えたものです。ある数の2の補数は、その数の負の数を表します。
たとえば、4ビットで 0101(10進数で5)の2の補数を求めてみましょう。
- 各ビットを反転:
0101→1010 - 1を加える:
1010+0001=1011
1011 は4ビットの2の補数表現で −5 を意味します。
補数を使った減算
Section titled “補数を使った減算”7 - 5 を2進数の補数で計算してみましょう。
- 7 の2進数表現:
0111 - 5 の2の補数:
1011(上で求めた −5)
0 1 1 1 (7)+ 1 0 1 1 (−5)----------- 1 0 0 1 04ビットに収まる部分だけを取ると 0010(10進数で2)となり、7 − 5 = 2 と一致します。あふれた最上位の1(5桁目)は桁上がり(キャリー)として捨てます。
試験で出るポイント
表現可能な数値の範囲
Section titled “表現可能な数値の範囲”コンピュータで数値を表すには、あらかじめ使用するビット数(桁数)を決めておく必要があります。ビット数によって表現できる数の範囲が決まります。
符号なし整数
Section titled “符号なし整数”正の数だけを扱う場合、nビットで表現できる範囲は次のとおりです。
0 〜 2ⁿ − 1
| ビット数 | 表現可能な範囲 | 値の個数 |
|---|---|---|
| 4ビット | 0 〜 15 | 16通り |
| 8ビット | 0 〜 255 | 256通り |
| 16ビット | 0 〜 65,535 | 65,536通り |
符号付き整数(2の補数表現)
Section titled “符号付き整数(2の補数表現)”負の数も扱う場合(最上位ビットを符号ビットとして使う)、nビットで表現できる範囲は次のとおりです。
−2ⁿ⁻¹ 〜 2ⁿ⁻¹ − 1
| ビット数 | 表現可能な範囲 | 値の個数 |
|---|---|---|
| 4ビット | −8 〜 7 | 16通り |
| 8ビット | −128 〜 127 | 256通り |
| 16ビット | −32,768 〜 32,767 | 65,536通り |
いずれの場合も、nビットで表現できる値の個数は 2ⁿ通り です。たとえば、RGB各色を3ビットで表現すると、1色あたり2³ = 8通りなので、全体では 8 × 8 × 8 = 512色を表現できます。
試験で出るポイント