位取り記数法とは
10進数の4,095では、4は4ではなく4,000を表します。千の位にあるからです。それぞれの位は、数字に10のべき乗(1、10、100、1,000…)をかけます。これが位取り記数法で、基数とは使う数字の種類の数です。10進数では10種類です。
2進数も同じ仕組みですが基数は2で、使えるのは0と1だけ、各位の価値は1つ下の位の2倍になります。16進数は基数が16で、16個の数字は0〜9とA〜Fの文字、各位の価値は1つ下の位の16倍です。コンピューターが2進数で動くのは、回路が2つの状態(オフとオン)を区別するだけで済むからで、16進数はそのビットを短く書く方法です。
| 位(右から左へ) | 2進数での価値 | 16進数での価値 |
|---|---|---|
| 1番目 | 1 | 1 |
| 2番目 | 2 | 16 |
| 3番目 | 4 | 256 |
| 4番目 | 8 | 4,096 |
| 5番目 | 16 | 65,536 |
| 6番目 | 32 | 1,048,576 |
| 7番目 | 64 | 16,777,216 |
| 8番目 | 128 | 268,435,456 |
2進数から10進数へ(手計算)
各桁にその位の価値を書き、1がある位だけを足します。1101を例にします。右から左へ、位の価値は1、2、4、8です。
- 数を書き、その下に各位の価値を書きます。1 1 0 1 の下に 8 4 2 1。
- 各位に何があるかを見ます。8の位に1、4の位に1、2の位に0、1の位に1です。
- 0がある位は無視します(ここでは2の位)。
- 足します。8 + 4 + 0 + 1 = 13。したがって2進数の1101は10進数の13です。
桁数が増えても同じです。11111111は128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255で、8ビットに収まる最大の値です。また10110110は128 + 32 + 16 + 4 + 2 = 182です。
10進数から2進数へ(割り算の繰り返し)
数を2で割ることを、商が0になるまで繰り返し、毎回の余り(必ず0か1)を書き留めます。余りを下から上へ読むと2進数になります。45を例にします。
- 45 ÷ 2 = 22、余り1
- 22 ÷ 2 = 11、余り0
- 11 ÷ 2 = 5、余り1
- 5 ÷ 2 = 2、余り1
- 2 ÷ 2 = 1、余り0
- 1 ÷ 2 = 0、余り1
余りを下から上へ読むと101101になります。確認するには足してみます。32 + 8 + 4 + 1 = 45。
もう1つ、好む人が多い方法があります。大きい2のべき乗から順に引いていく方法です。200の場合:128が入り(残り72)、64が入り(残り8)、32と16は入らず、8は入ります(残り0)。使った位は128、64、8なので、200 = 11001000です。
16進数:16個の数字と手元に置ける対応表
10〜15を表す数字はないため、文字のA、B、C、D、E、Fを使います。16進数の1桁は、ちょうど4ビット(「ニブル」)に当たります。そのため便利で、8ビットの1バイトをたった2桁の16進数で書けます。
16進数から10進数にするには、各桁にその位の16のべき乗をかけて足します。たとえば3F = 3 × 16 + 15 = 63、A3 = 10 × 16 + 3 = 163です。
| 10進数 | 2進数(4ビット) | 8進数 | 16進数 |
|---|---|---|---|
| 0 | 0000 | 0 | 0 |
| 1 | 0001 | 1 | 1 |
| 2 | 0010 | 2 | 2 |
| 3 | 0011 | 3 | 3 |
| 4 | 0100 | 4 | 4 |
| 5 | 0101 | 5 | 5 |
| 6 | 0110 | 6 | 6 |
| 7 | 0111 | 7 | 7 |
| 8 | 1000 | 10 | 8 |
| 9 | 1001 | 11 | 9 |
| 10 | 1010 | 12 | A |
| 11 | 1011 | 13 | B |
| 12 | 1100 | 14 | C |
| 13 | 1101 | 15 | D |
| 14 | 1110 | 16 | E |
| 15 | 1111 | 17 | F |
16進数が使われる理由:バイト、色、アドレス
1バイトは8ビットで、0〜255(00000000〜11111111)の値を取ります。ビットを手で書くのは遅く、間違いやすいものです。16進数なら同じバイトが00〜FFの2文字で済みます。2進数から16進数にするには、ビットを右から4つずつに区切り、各グループを表の数字に置き換えます。例:11010111は1101と0111に分かれ、それぞれDと7なので、D7です。10進数では13 × 16 + 7 = 215です。
いちばん有名なのはWebの色です。#FF8800には3つのバイトがあります。赤がFF(255)、緑が88(136)、青が00(0)です。これは鮮やかなオレンジで、赤は最大、緑は半分より少し多く、青はゼロです。16進数はメモリのアドレスやエラーコード、ネットワークの識別子にも登場します。
ASCIIでテキストを2進数に
コンピューターは文字を数として、その数をビットとして保存します。ASCIIの表ではAは65で、8ビットの2進数にすると01000001です。「Hi」は2文字で、Hは72(01001000)、iは105(01101001)なので、01001000 01101001と書きます。「Hola」は72、111、108、97、つまり01001000 01101111 01101100 01100001、16進数では48 6F 6C 61です。
このツールはUTF-8という符号化を使います。英語の基本的な文字は1文字が8ビットの1バイトですが、日本語の文字、ñ、アクセント付きの文字、絵文字は複数のバイトを使うため、8ビットを超えます。たとえばñは2バイトで、11000011 10110001(16進数でC3 B1)です。
ツールで同じことをする方法
「2進数・10進数・16進数変換」は、手計算の確認や、長い数をミスなく解くのに役立ちます。
- その進数の欄に数を入力します。「10進数(基数10)」「2進数(基数2)」、8進数、「16進数(基数16)」のどれかです。残りの3つは自動で入力されます。
- その進数で使えない数字(たとえば2進数の2)を入力すると、ツールが知らせてくれます。
- テキストの場合は、「テキスト」の欄に入力して、「2進数(1文字あたり8ビット)」とバイトごとの16進数を見ます。8ビットずつのビット列を貼り付けて、テキストに戻すこともできます。
- 変わった進数には「好きな進数(2〜36進数)」を使います。変換元の進数、変換先の進数、数値を選びます。
制限として、変換できるのは0以上の整数のみ(小数や符号は不可)で、先頭の0は自動では付かないため、8ビットに固定したいときは自分で補います(13は00001101)。入力した内容がブラウザの外に出ることはありません。
よくある間違い
- 余りを逆の順に読む:割り算を繰り返す方法では、最初の余りが一番右の桁で、一番左の桁ではありません。
- 必要な先頭の0を忘れる:13は1101ですが、バイトにすると00001101です。色やネットワークマスクのように、長さがデータの一部になる場合に重要です。
- コピーするときに、アルファベットのOを0と、16進数のB(11)を8と取り違える。16進数の文字は大文字でも小文字でも同じ値ですが、数字とは別のものです。
- 変換するときに0xや#を残す:これらは16進数であることを示す印にすぎないので、貼り付ける前に取り除きます。
- 2進数の10を十だと思う:二です。同じ「10」でも、進数によって2、10、16になります。
練習問題(解答つき)
答えを見る前に1問ずつ解いてみて、あとでツールで確かめてください。
- 10110110を10進数と16進数にしてください。答え:128 + 32 + 16 + 4 + 2 = 182。4桁ずつに分けると、1011 0110 = B6。
- 200を2進数と16進数にしてください。答え:11001000とC8(12 × 16 + 8 = 200)。
- 7Fを2進数にしてください。答え:7 = 0111、F = 1111なので01111111で、10進数では127。
- 「OK」を2進数で書いてください。答え:Oは79、Kは75なので、01001111 01001011。
よくある質問
2進数の1101を10進数にするには?
1がある位の価値を足します。8 + 4 + 1 = 13。右から2番目の桁は0なので、2は足しません。
255は2進数と16進数でいくつですか?
255は2進数で11111111、16進数でFFです。8ビットの1バイトに収まる最大の値です。
16進数はなぜ文字を使うのですか?
16個の異なる記号が必要なのに、10進数の数字は10個(0〜9)しかないからです。そのためAは10、Bは11、Cは12、Dは13、Eは14、Fは15を表します。
8ビットでは何通りの数を書けますか?
0〜255の256通りです。一般に、nビットでは2のn乗個の値を表せます。
ツールはマイナスの数や小数も変換できますか?
いいえ、0以上の整数だけです。テキストはUTF-8を使うので、アクセント付きの文字や絵文字は8ビットを超えます。