[techaday:0009] 2進数を10進数から簡単に暗算で変換する方法

[techaday:0009] 2進数を10進数から簡単に暗算で変換する方法

何か綺麗ですね・再び

はじめに

以前の記事では,2進数を頭の中で10進数に変換するには,下から3桁ずつ読めば楽になるという記事を書きました.
[techaday:0006] 2進数は下から3桁ずつ読もう

今回はこの考え方を応用して,0から255までの10進数を簡単に2進数に変換する方法について書きます.

まずはじめにナイーブな方法を書いて手順を試した後に,今回紹介する方法の優位性について納得してもらうという構成で行きます.

前提知識

効能

  • 10進数から2進数への変換が結構速くなる

従来法

最上位のビットと最下位のビットは大小関係と偶奇からすぐに確定するので,そこを確定させてから引き算を逐次行って埋めていく方法があります.

例えば153という数値は最上位のビットと最下位のビットは確実に1になります(\(153 \geq 2^7=128\)で,奇数). 確定したビットの数値を引くと,\(153-129=24\) となります.
\(24-16=8\) ですから,4ビットめと3ビットめが1になり,
$$
(153)_{10} = (10011001)_2
$$
となります.

この方法は,1のビットが多くなる時に引き算が大量に必要になり,暗算向きではありません.
例えば,189を考えると,
$$
189-129=60\\
60-32=28\\
28-16=12\\
12-8=4
$$
と言った具合になり,
$$
(189)_{10} = (10111101)_2
$$
とようやく分かります.
文字で見ると楽に見えるかもしれませんが,これは暗算で咄嗟にやりたいものではないですよね.

提案手法

まずは上位の2ビットを確定させることからスタートします.
残った数値は6ビットで表現できます.したがって最大値は63です.
2進数の性質を使うと,この数値を8で割った答えが上の3ビット,余りが下の3ビットになることがすぐにわかります.

今回の例では \(128 \leq 153 < 192\) ですから,上位2ビットは 10 とわかります.
残りのビットでできる数は \(153-128=25\) です.
\(25=8 \times 3 + 1\) ですから,上の3ビットは 011 下の3ビットは 001 となります.
したがって上記と同じ結果が出ます.

189の場合も,先に上位2ビットを考えると 10 となり,
$$
189-128 = 61\\
61 = 8 \times \underbrace{7}_{(111)_2} + \underbrace{5}_{(101)_2}
$$
から,
$$
(189)_{10} = (10|111|101)_2
$$
が直ちに導けます.

この方法のいいところは計算が簡単になるだけでなく,ある一定のビット数まとまって確定する点にあります.これによって,変換の途中に必要な短期記憶を圧倒的に減らせます.
頑張って考えればもっと減らせると思うのですが,今度は前提として記憶しなければならない数値の数が増えたり手順が複雑になりそうなので,このあたりが現実的に使えるちょうどいい方法なんじゃないかと思います.

まとめ

  • 10進数を2進数に暗算で変換する際に使える方法を書いた

補足

  • 特になし