FF(16進数の掛け算)を覚えよう


最近、あるプログラマと話していて気づいたのだけど、彼は16進数の2桁と1桁との掛け算(FDh×5とか)が出来ない。やり方自体を知らないのだ。彼はWindowsの電卓を立ち上げて計算していた。


そのときは「プログラマでなくともこんなこと知ってて当然だろ!」と思ったのだけど、その後、10人ぐらいのプログラマに出来るかどうか聞いてみたが誰も出来ない。


結局、「普通は出来ない」のだと私は理解した。しかし16進数の掛け算はそんなに難しくない。私が子供のころには、まわりにFF(1×1=1に始まって、F×F=E1まで)を丸暗記している人がいっぱいいた。情報教育の一環として中学か高校で教えても計算の仕方ぐらい教えればいいのになぁと思っている。


前置きが長くなったが、以下にやり方などを書いておく。


■ 16進数に馴染もう


16進数では、A = 10 , B = 11 , C = 12 , D = 13 , E = 14 , F = 15となる。Aは10というのと、Fは15というのは覚えていても、CやDが怪しい人が結構いる。Aは考えずに、Bから1,2,3,…と覚えたほうがわかりやすいかも知れない。また、音楽をやっている人なら、B(シ)からの度数だと覚えておくといいかも知れない。F(ファ)なら五度だから15とか。


次に、16の倍数を少なくとも128まですらすら言えるようにすること。16,32,48,64,80,96,112,128である。2のN乗である16,32,64,128は言えるだろうが、96と112を覚えていない人が多いので、これも覚えておくべし。96 = 60hがわかっていれば、100 = 64hはすぐにわかるはずだ。


そして補数表現での値も覚えておくべきだ。A , B , C , D , E , Fなら、(その数と足して16になる) 6 , 5 , 4 , 3 , 2 , 1が対応する値だ。Aなら6 , Cなら4というのがパっと頭に浮かぶようにしておくべし。言うまでもなく、7 なら 9だし、3 なら D だ。


■ 16進数の引き算


16進数の足し算は出来るとして、引き算の仕方を今一度確認しておく。以下、16進数か10進数か紛らわしい時にのみ16進数にhをつける。C2やFCとかなら16進数だと見ればわかるのでここではhは省略する。


・繰り下がりない場合、10進数の引き算と同じ要領でやれば良い。
例) 7F - 2B = 54h


F - B = 4というのがパッとわからない人は、F = 15 , B = 11で 15 - 11 = 4と考えても良いし、音楽をやっている人なら、BからFまで5度だから1引いて4と考えても良い。


・繰り下がりのある場合 その1
例) 80h - 2Ch = 54h


1の位で繰り下がりが起きることはわかるから、答えの上の桁の数字が8 - 2 - 1(繰り下がり) = 5になるのはわかると思う。
そのあと 10h - C という計算が必要になるが、これは、Cの補数である4だ。このように引き算には補数が必要だ。


10進数のときも、80 - 23 = 57と、3の補数である7が1の位に出てくるが、これと同じである。


・繰り下がりのある場合 その2
例) 83h - 25h = 5E


これも答えの上の桁が5になることはわかる。そのあと1の桁は 3 - 5 = -2となって、-2は2の補数だから、E。


このように引き算には補数が必要になるのは、実は、これは10進数の計算でも同様なのだが、10進数の引き算は小学校で習うときは補数やマイナスの数という概念を知る以前なので、そういった説明を聞かないまま引き算を習得するため、自覚している人は少ないのかも知れない。


■ 掛け算


・9以下の数字×9以下の数字


これは10進数の九九を使って計算して、そのあと16進数に変換していいと思う。
例えば、5×6 = 30。32(20h)より2少ないから、1E。


このように、128までは16の倍数を覚えておくのが一つ目のポイント。
二つ目のポイントは「20hより2少ない」というときに引き算が必要なので補数を覚えていること。


・9以下の数字 × AからFまでの数字


スーパーで買い物をするときに298円のものを3つ買うとしたら、どのように計算するだろうか。
300円×3 で、そこから足しすぎたぶんの2円×3を引いて900 - 6 = 894円と計算するのが普通ではなかろうか。


それと同じで、A〜Fを掛け算するときも、引き算とみなしたほうがやりやすい。


例1) 5×F なら、5×10h = 50hからから足しすぎた5 × 1 = 5を引く。50h - 5 = 4B である。F = -1と考えてその5倍である-5 = Bになっていると考えるとわかりやすい。


例2) 9×E も 90hから足しすぎた9 × 2 = 18(12h)を引く。90h - 12h = 7Eである。E = -2と考えてその9倍が-18 , 18も一気に引くのは大変なのでまず16引いて、80h。あと2を引かなければならない。2を引くには2の補数であるEを思い出して、80h - 2 = 7Eと考えると計算しやすい。


例) FD×5 = (100h - 3)×5 = 500h - 15 = 4F1


・9からFまでの数字 × 9からFまでの数字


例) E×F = D2

E×Fは次図の赤い長方形の面積である。



この面積は全体(10h×10h = 100h)から、2×10hと10h×1の長方形の面積を引いて、そこに右下の(重複して引き算してしまった)2×1の長方形の面積を足した面積である。つまり、100h - (1+2)×10h + 2×1 であるから、D2とわかる。


中学生のときに習う展開公式にあてはめて E × F = (10h - 2)×(10h - 1) = 100h - (2+1)×10h + 2としてもいいが、面積として考えたほうが符号を間違えないで済むと思う。


慣れてくると、E×Fと見ると-2と-1が頭に浮かんで、それを足した-3 = D,そこに、-2×-1 = 2。ふたつでD2。というように計算できる。
F×Fなら-1が2つで-2 = E と -1×-1 = 1でE1という感じだ。


例) C×D = 9C 。C,Dは-4,-3。足して-7 = 9 , 掛けて +12 = C。9C。


例) A×A = 64 。Aは-6。足して-12 = 4,掛けて+36 = 32(20h) + 4。64h。
まあ、100 = 64hはよく使う定数なので覚えているかも知れない。覚えているならA(10)×A(10) = 100 = 64hはすぐにわかるはず。


例) 9×E = 7E。9は-7,Eは-2。足して-9 = 7,掛けて+14 = Eで7E。


■ その他のテクニック


4 × 4 = 10h , 8 × 8 = 40h , C×C = 90hは2乗をして1桁目が0になるで覚えておく価値がある。4×4 = 16 = 10h,8×8 = 64 = 40hはわかるとして、C×C = 90hは、Cで9になるのでseek youとか適当な語呂合わせで覚える。


B×D = (C - 1)(C + 1) = C×C - 1×1(2乗の差の公式) = 90h - 1 = 8F。
A×E = (C - 2)(C + 2) = 90h - 4 = 8C。


(AA = 64hを覚えているなら)
A×B = A×B = A×(A + 1) = A×A + A = 64h + A = 6Eとか。


10進数の掛け算で5を掛けるときに10倍して2で割ったのと同じ理屈で16進数の掛け算でも8を掛けるなら10h倍して2で割るだとか。
8×E = 10h/2 × E = 10h×E / 2 = E0 / 2 = 70h
8×9 = 90h / 2 = 48h



■ まとめ


電卓はほどほどに。