Рассмотрим способность реализации в двоичной арифметике умножения. "Быстрый" вариант обыкновенного умножения был известен еще в Древнем Египте, его также называют "русским" или "крестьянским" методом.

Разберем пример такого умножения. Умножим 23 на 43 "русским методом".

23
×
43
46
21
92
10 (четное)
184
5
368
2 (четное)
736
1

 

Первый столбец состоит из результатов последовательного умножения первого сомножителя на 2, а второй - из результатов последовательного целочисленного деления второго сомножителя на 2. Далее суммируем числа первого столбца, рядом с которыми во втором столбце стоят нечетные числа.

Ответ: 23 х 43 = 23 + 46 + 184 + 736 = 989.

Такое умножение основано на следующих тождествах:

а - четное: а х b = a/2 × (b × 2) = (a/2 × b) × 2
а - нечетное: а х b = (a-1)/2 × (b × 2) + b = ((a-1)/2 × b) × 2 + b.

 

В результате получаем следующий рекурсивный алгоритм умножения целых двоичных чисел:

 

При реализации такого алгоритма в ограниченном числе разрядов к неверному результату могут привести операции сдвига влево (если старший разряд ненулевой) и сложения. В примере показаны ошибки, возникающие при работе в ограниченном числе разрядов.

Определим, при каких ограничениях умножение чисел в k-разрядах дает верный результат с точки зрения обычной арифметики.

 

Целочисленное деление с остатком в двоичной системе сводится к сравнению и вычитанию. Если как делимое так и делитель представимы в k-разрядном типе, то и результат деления и остаток от него будут получены правильно. Однако, если в делении участвуют отрицательные числа, то остаток компьютерного деления может не совпадать с математическим понятием остатка, и об этом следует помнить при программировании.