乗算って、例えばA×Bってのは、AをB回足したのと同じだから、単純に掛ける数の回数で掛けられる数を加算すると、これで答えが出てしまうんです。簡単ですよね。
この考え方で、2進数の値を見ていきます。2進数の掛け算は2倍が基本です。左シフト1回で2倍となります。右シフトだと1/2になります。例えば、%00111000 * %10(56 * 2 の2進数表現)は、単純に2倍なので %01110000 となります。掛け算部分をシフトしてみると…
例えば 56×19 という乗算を考えます。昔の算数の考え方では、下の桁を合わせて、各桁毎に掛けていきました。計算式に直してみます。
9 * 6 + 9 * 50 + 10 * 6 + 10 * 50 = 1064
ここで注目したいのが50とか10という部分です。これ、無意識に10進数で分解してますよね。元の数値が10進数だから、自然とそう計算しているわけです。では、これを2進数で表すとどうなるでしょうか。
56 = %00111000 19 = %00010011
乗算においてゼロは掛けてもゼロのままですから、意味がないのですっ飛ばすと…
%00111000 * %1 + %00111000 * %10 + %00111000 * %10000 = %0000100_00101000 = 1064
ところで、乗算は掛ける数と掛けられる数に、それぞれ同じ数を掛けて割ると結果が変わらないという特性があります。例えば、12 * 8 = 24 * 4 = 48 * 2 = 96 * 1 = 96 とそれぞれ 2倍と1/2をしていった結果、片側の数が 1 になって答えに辿り着いたりします。
この考え方で、2進数の値を見ていきます。2進数の掛け算は2倍が基本です。左シフト1回で2倍となります。右シフトだと1/2になります。例えば、%00111000 * %10(56 * 2 の2進数表現)は、単純に2倍なので %01110000 となります。掛け算部分をシフトしてみると…
%00000000_00111000 + %00000000_01110000 + %00000011_10000000 = %0000100_00101000 = 1064
ここで既に気が付いた人もおられるかも。掛ける数を1/2したら、掛けられる数を2倍して、bitが立っていたら、その時の掛けられる数を加算していけば同じことになります。この考え方を Z80 のコードに落とし込むと、次のようになります。
コメント