Рассмотрим способность реализации в двоичной арифметике умножения. "Быстрый" вариант обыкновенного умножения был известен еще в Древнем Египте, его также называют "русским" или "крестьянским" методом.
Разберем пример такого умножения. Умножим 23 на 43 "русским методом".
23
|
×
|
43
|
46
|
|
21
|
92
|
|
10 (четное)
|
184
|
|
5
|
368
|
|
2 (четное)
|
736
|
|
1
|
Первый столбец состоит из результатов последовательного умножения первого сомножителя на 2, а второй - из результатов последовательного целочисленного деления второго сомножителя на 2. Далее суммируем числа первого столбца, рядом с которыми во втором столбце стоят нечетные числа.
Ответ: 23 х 43 = 23 + 46 + 184 + 736 = 989.
Такое умножение основано на следующих тождествах:
В результате получаем следующий рекурсивный алгоритм умножения целых двоичных чисел:
При реализации такого алгоритма в ограниченном числе разрядов к неверному результату могут привести операции сдвига влево (если старший разряд ненулевой) и сложения. В примере показаны ошибки, возникающие при работе в ограниченном числе разрядов.
Рекурсивный спуск:
Рекурсивный подъем:
Ответ: 14·100 = 120 (в 8-разрядной арифметике).
Заметим, что полученное число равно остатку от деления 14-100 = 1400 на 256 = 28, то есть умножение произведено по модулю 256 = 28.
Определим, при каких ограничениях умножение чисел в k-разрядах дает верный результат с точки зрения обычной арифметики.
Целочисленное деление с остатком в двоичной системе сводится к сравнению и вычитанию. Если как делимое так и делитель представимы в k-разрядном типе, то и результат деления и остаток от него будут получены правильно. Однако, если в делении участвуют отрицательные числа, то остаток компьютерного деления может не совпадать с математическим понятием остатка, и об этом следует помнить при программировании.