暗算で 16 進数を 2 進数に変換する方法
C 言語などでビットの定義を行う場合、
ビットシフト(<<)も使いますが、 16 進数で表記することも多いです。
何故 16 進数で記述するかというと 16 進数は 2 進数に変換しやすいためです。
C 言語でゴリゴリ書くのが主流だった時代は、
結構みんな独自の計算方法を持っていて、すぐに 2 進数に変換していました。
しかし、最近ではこの変換をできない人が増えてきた気がします。
そこで今回は私がやっている暗算で 16 進数を 2 進数に変換する方法を紹介したいと思います。
ただ、魔法のような便利な方法があるわけではなく、掛け算における九九のように暗記よる部分が多いです。
進数表記の基礎
まず最初に進数表記について簡単に説明します。進数表記の種類としては 16, 10, 8, 2 進数などがあり、 通常、私達が使っているのは 10 進数です。
2, 8 進数などの場合、たまに 2, 8 まで使えると勘違いする人がいます。 これは 10 進数を考えると分かりやすいと思います。
10 進数では 0-9 までの 10 個の数字を使い、 10 で一つ桁上りします。
同様に 2 進数では 0, 1 の 2 つの数字を使い、 2 で一つ桁上りして 10 となります。 さらに 3 は 10 + 1 = 11 となり、 4 は 2 桁目も繰り上がり 100 となります。
16 進数では逆に 9 までの数字では足りないので、 A-F (a-f)のアルファベットを足して 一桁 15 までとなり、 16 が 10 となります。
8 進数から 2 進数への変換
16 進数の前に 8 進数から 2 進数への変換を身につける必要があります。実際どうやるかというと、次の表の変換を全部覚えるという力技です。
8 進数 | 2 進数 |
---|---|
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
ただそれだけだとあんまりなので、少し暗記のコツを書いておきます。
0-3: ここぐらいまでは 2 進数を理解していれば、覚えるまでもなくすぐに計算できるはずです。
4: 2, 4, 8 といった 2 の乗数は 2 進数の特徴でビット(1)が一個ずつずれていく感じになるので、 覚えやすいのではないかと思います。
7: これは 8 の一つ手前は全部ビットが立つと覚えます。
後は 5, 6 の 2 つを頑張って覚えれば完了です。
8 進数を使っている例としては Unix の chmod コマンドでの 8 進数による指定があります。 最初はこんなわかりづらいの誰が使うのだろうと思っていたのですが、 プログラミングをやりだした後は結構 8 進数で指定するようになっていました。
16 進数から 2 進数への変換
それではいよいよ 16 進数からの変換です。これは 8 と残りというように考えて計算します。例えば A は 10 なので、 8 + 2 です。 8 は 1000 なので、 8 進数の変換とあわせて次のように計算します。
A (Hex) = 8 + 2 = 1000 + 10 = 1010 (Bin)ここで必要となってくるのが、 8 引いた残りの値ですが、 これはまた暗記します。
16 進数 | 8 + x |
---|---|
A | 2 |
B | 3 |
C | 4 |
D | 5 |
E | 6 |
F | 7 |
最初の A と最後の F は覚えやすいと思います。 あと、 C, D の真ん中辺りをしっかり覚えれば、アルファベット順なので B, E はすぐ出てきます。
「こんなにいろいろ覚えるのであれば、 最初から 0 から F までの 2 進数の変換結果を覚えればいいのでは?」と思われるかもしれません。
しかし、 人は記憶するとき 3 つまでは記憶しやすいと言われています。 4 桁を覚えるのは結構キツイです。
ここまで読んでみて「大変そう」と感じるかもしれませんが、やってみたら大したことはないです。 知っていると便利ですし、 プログラマーの特有の変わった技術として身につけておくのもいいのではないでしょうか。
- 関連記事
trackback
ここは酷い両論併記ですね
新規トラックバック
Facebook コメント
コメント