「社会と情報」の授業は、
先週から2進数の引き算や、
負の数の表現などに入っています。
生徒の復習用に、
授業のエッセンスをこのブログに
まとめておきたいと思います。
今回は、2進数の引き算の原理についてです。
1 10000円で買い物もう30年以上前ですが、
「いちのへストア」(現在のジョイス)などの
スーパーマーケットの就職試験に
釣り銭計算の適性試験が
出されていたことがありました。
2564 3876 8924 7631 ・・・
など、4桁の数がたくさん並んでいて、
10000円札からのお釣りを
どんどん書いていくというものです。
皆さんはどのように計算しますか。
実はこの計算には
スペシャルメソッドがあります。
それは9による補数表現を使う方法です。
9の補数とは、
例えば5といわれたら4、
6だったら3というように、
あわせて9になるような
相方の数のことです。
この考えによって、
次のように釣り銭計算します。
例えば2464円の場合、
まず次のように各桁の数の
補数を書き込みます。
2 → 7
4 → 5
6 → 3
4 → 5
出てきた答えに1を足せば
それが1万円からのお釣りです。
7535+1=7536円
なぜこのようにできるのでしょう。
それは、
10000=9999+1
と考えれば簡単にわかります。
10000-2464
=9999+1-2464
=9999-2464+1
=7535+1
=7536
ということですね。
私は初任校で、
就職試験に向かう生徒たちに
9による補数を
瞬時に頭に浮かべるような
トレーニングをしていました。
学力検査で数学の点数が
0点~9点という生徒が
たくさんいる学校でしたが、
どの生徒も、
とっても楽しく取り組んでくれて、
全員が30秒で20個以上の釣り銭を
書き込めるようになったことを覚えています。
2 9の補数表現を用いた引き算では、この考えを使って
引き算をしてみましょう。
例えば、
734-485
を考えましょう。
普通に引き算しようとすると、
引かれる数より引く数が
大きかったりすると面倒ですね。
そこで、次のように考えます。
734-485
=734-485+1000-1000
いきなり1000を足して1000を引きます。
こうやっても元の式と変わりませんね。
伊藤潤一先生によると、
このような手法を
「殴って、さする」
というのだそうです。
頭を殴ってからさすれば、
何もしなかったことと同じ、というね(笑)。
さて、さらに次のように考えていきます。
734-485+999+1-1000
=734+(999-485+1)-1000
上の式のカッコ内が
先ほどの補数表現によって、
瞬時に515とわかります。
ということは、
734+515という「足し算」をして、
その結果である和の1248の
最高位の位(1000)を落としたものが
答えということになりますね。
3 2進数の引き算では本題に入りましょう。
いよいよ2進数の引き算です。
例えば、
111011-101100
という6bitの2進数の引き算を
考えてみましょう。
まず、「殴ってさすり」ます。
111011-101100+1000000-1000000
ここで、
1000000=111111+000001
であることに注意してください。
すると、今度は引く数101100の、
9ではなく1による補数表現を
考えるわけです。
つまり、
101100+ナゾの数=111111
となるような数です。
それは、101100の各桁の数について、
0を1、1を0に反転させればいいだけですね。
これは10進数よりめっちゃカンタンです。
そこで、010011が得られ、
それに000001を足すと
010100が得られます。
すると、最初の引き算は
111011+010100-1000000
つまり、最初の2数の和を求めて、
最高位の数を
カットすればいいということです。
足し算はもう皆さんやっていますから
大丈夫ですね。
111011+010100=1001111
よって答えは001111ということになります。
実際、111011を10進数で表すと
32+16+8+2+1=59
101100を10進数で表すと
32+8+4=44
59-44=15となり、
15を2進数(6ビット表現)で表すと
001111となるので、
確かに正しいことがわかりますね。
このように引き算を補数による
足し算に変換することで、引き算も
コンピュータ上では加算回路だけで
賄うことができるわけです。
簡単な方法ですが、普段使わないので
忘れてしまいそうですね。
ホワイトボードに書いた
板書をあげておきますので
時々確認してくださいね。


では次回は
負の数の2進数表現についてまとめますね!
トラックバックURL:
http://simomath.blog.fc2.com/tb.php/1605-076f3c59