2進数から10進数への変換
「1101」を見せられても、13 だとは言えない
コンピュータの中身は、電気が流れているかいないかの二択しかありません。だから数も文字も色も、最後は 0 と 1 の並びに落ちます。この並びを読み書きできないと、この先のビット演算もメモリの話も、ずっと他人事のままになります。
とはいえ 1101 と書かれた紙を渡されて、これが 13 だと即答できる人は多くありません。10 進数なら読めるのは、一の位、十の位、百の位という桁の重みを知っているからです。2 進数でも、知るべきものは同じ「桁の重み」だけです。
桁ごとに重みが決まっている
10 進数の 253 は 2 * 100 + 5 * 10 + 3 * 1 に分解できます。右端から 1、10、100 と、桁が 1 つ左へ行くたびに重みが 10 倍になります。
2 進数はここが 2 倍ずつになるだけです。右端から 1、2、4、8、16 と続きます。重みは 2 の累乗なので、手元で並べて確かめられます。
Python
for i in range(8):
print(i, 2 ** i)
# 0 1
# 1 2
# 2 4
# 3 8
# 4 16 ... 7 128 まで続く| 2 進数 | 立っている桁の重み | 10 進数 |
|---|---|---|
0001 | 1 | 1 |
0101 | 4 + 1 | 5 |
1010 | 8 + 2 | 10 |
1101 | 8 + 4 + 1 | 13 |
1111 | 8 + 4 + 2 + 1 | 15 |
0 の桁は、足さなくてよい
1101 の右から 2 桁目は 0 です。重み 2 を掛けても 0 なので、合計に影響しません。だから「1 が立っている桁の重みだけ拾って足す」で答えが出ます。1101 なら 8 + 4 + 1 で 13 です。
10 進数の 203 で十の位を計算しても 0 にしかならないのと、まったく同じことです。
桁が増えても手順は変わりません。10110 なら、右から 5 桁目の 16、3 桁目の 4、2 桁目の 2 を足して 22 です。重みを右端から順に振り直すところだけ、落ち着いてやってください。ここを 1 つずらすと、答えは倍か半分になります。
桁が 1 つ増えると、表せる数は 2 倍になる
4 ビットなら 0000 から 1111 まで、0 から 15 までの 16 通りです。ビットが 1 本増えるたび、いちばん上に今までの合計より大きい重みが乗るので、通り数はきれいに倍になります。8 ビットで 256 通り、16 ビットで 65536 通りです。
覚え方 「1 バイト = 8 ビット = 256 通り」は、このあと文字コードでも色でも権限でも、同じ数字のまま出てきます。ここで一度だけ覚えれば足ります。
要件
- binary は '0' と '1' のみからなる文字列であると仮定して良い
- 組み込みの基数変換関数 (int(s, 2) や parseInt(s, 2)) は使わず、桁ごとに計算する
- 戻り値は 10 進数の整数 (int) であること
入出力例
binToDec("1101") → 13
binToDec("0") → 0
binToDec("1") → 1
binToDec("1010") → 10
binToDec("11111111") → 255
binToDec("100000") → 32