Hatena::ブログ(Diary)

やねうらお−俺のやねうら王がこんなに弱いわけがない。 (第2期) このページをアンテナに追加 RSSフィード

電王戦出場記念! 書籍化されたで! 監修したで!(`ω´) 絶版なってしもた 絶版プレミア価格 記事書いたで!
解析魔法少女美咲ちゃん マジカル・オープン!

YaneuLabs / やねうら王公式 / やねうらおにメール / twitter / プロフィール

 | 

2009-01-06 FF(16進数の掛け算)を覚えよう

[] FF(16進数の掛け算)を覚えよう  FF(16進数の掛け算)を覚えようを含むブックマーク  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は次図の赤い長方形の面積である。


f:id:yaneurao:20090106202916p:image


この面積は全体(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



■ まとめ


電卓はほどほどに。

akeomeakeome 2009/01/06 21:56 私は昔ちょっとあって16進数のかけ算はだいたい暗記してますね。
たまに人が計算してるときに後ろから言ったりするとびくりされます。

kmkm 2009/01/06 22:14 実際のところ、どういった場面で、プロの方々は16進数演算をされるのでしょうか?と、思ったりしました。

ねこだいすきねこだいすき 2009/01/06 23:15 プロの方々は、そんな計算も計算機に任せます。2進演算と桁判定さえ出来ればあとぜんぶ同じ要領ですから。レジスタを追うのは疲れたよ、ママン…

うさぴょんの育ての親うさぴょんの育ての親 2009/01/06 23:20 補数とか習う前に16進数触ってたので、小学生が10進数を筆算する方式と同じ方法で引き算やってました(苦笑)。

7 19
83h
-25h
-----
5E(E=14)

掛け算は…暗記してたはずなのに、いつの間にかもう覚えてない…orz

halxxxxhalxxxx 2009/01/07 03:21 最近アセンブリを触り始めて16進数に煩わされていたんで、この記事を参考に電卓計算から卒業したいと思います。まずは足し算から…

zahrkyzahrky 2009/01/07 05:37 プロアクションリプレイを使ってる友人で16進数の計算が一瞬でできる奴がいたなぁ。

ragerage 2009/01/08 23:45 バイナリフォーマットが上手く読み込めないときのデバッグなんかで必要ですね。
16進数の計算はエディタのcalcモードに頼りきりですけど九九なみにできたらデバッグ早くなるだろうなあ…。

 | 

人気blogランキング
1900 | 01 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 |


Microsoft MVP
Microsoft MVP Visual C# 2006.07-2011.06