コンピューターサイエンス入門:理論編
10進数から2進数への変換
この回でやること
整数の商と余りをたどり、10進数を2進数で表す手順と0の扱いを確かめます。
- 読む 約 7 分
- 最後にクイズ 1 問
逆向きは、当てずっぽうになりやすい
前回は2進数を10進数にしました。今回は逆で、13 を 1101 と表す方法を読み解きます。
重みを大きいほうから当てはめるなら、「13に8は入る、残り5、4も入る、残り1」と進みます。この方法では、最初に使う重みを探します。数が大きくても、桁数を先に探さずに済む手順が、2で割って余りを拾う方法です。
基数で割ると、右端の桁が余りに出てくる
10進数の 253 を10で割ると、商が25、余りが3です。余りは一の位で、商は一の位を捨てた残りです。この10のように、桁の重みを増やす倍率を基数と呼びます。
2進数の基数は2です。2で割った余りは必ず 0 か 1 で、それが右端の桁になります。商をさらに2で割れば、次の桁が分かります。
プレーンテキスト
13 ÷ 2 商6 余り1
6 ÷ 2 商3 余り0
3 ÷ 2 商1 余り1
1 ÷ 2 商0 余り1商が0になったら、残りの桁はありません。ここでいう商は整数です。13を2で割った結果を6.5のまま使うのではなく、商6と余り1に分けます。
余りは、出てきた順と逆に並ぶ
13の余りは 1、0、1、1 の順です。そのまま並べた 1011 は10進数で11なので、元の13と一致しません。逆順の 1101 なら 8 + 4 + 1 = 13 になります。
左右対称な 1001 のような並びでは、逆順にするのを忘れても答えが変わりません。向きを確かめるには、左右が違う例で元の数へ戻してみると分かります。
この「割って余りを拾う」形は、秒数を時分秒に分けるときにも使います。
Python
sec = 3725
print(sec % 60) # 5 秒
print(sec // 60 % 60) # 2 分
print(sec // 3600) # 1 時間% は余り、// は整数の商を求めるPythonの記号です。3725秒は1時間2分5秒で、3600 + 120 + 5 = 3725 と確かめられます。
0 は、空の並びにはしない
最初の数が0なら、割り算を繰り返す前から終わりです。余りは集まりませんが、数の表記としては 0 の1文字を使います。何もない状態とは区別します。
例題で確かめる
機器の設定値18を、2進数の表示へ直します。
| 割る前の数 | 2で割った商 | 余り |
|---|---|---|
| 18 | 9 | 0 |
| 9 | 4 | 1 |
| 4 | 2 | 0 |
| 2 | 1 | 0 |
| 1 | 0 | 1 |
余りを下から読むと 10010 です。重みで戻すと 16 + 2 = 18 なので、元の設定値と一致します。