Является ли алгоритм будки для умножения только для умножения 2 отрицательных чисел (- 3 * -4)
или одного положительного и одного отрицательное число (- 3 * 4)
? Всякий раз, когда я умножаю 2 положительных числа с использованием алгоритма будки, я получаю неверный результат.
пример: 5 * 4
A = 101 000 0 // двоичное число 5 равно 101
S = 011 000 0 // двойное дополнение 5 равно 011
P = 000 100 0 // двоичное число 4 равно 100
x = 3 количество бит в m
y = 3 количество бит в r
m = 5
-m = 2-е дополнение к m
r = 4
После сдвига вправо P на 1 бит 0 000 100
После сдвига вправо P на 1 бит 0 000 010
P + S = 011 001 0
После сдвига вправо на 1 бит 0 011 001
Отбрасывание LSB 001100
Но оказывается, что это двоичное число 12. Это должно было быть 20 (010100)
UPDATE после ответа @ ruakh
5 * 4 = 20
m = 0101 is 5
r = 0100 is 4
A = 0101 0000 0
S = 1010 0000 0
P = 0000 0100 0
сдвинуть P вправо на 1 бит: 0 0000 0100
сдвинуть P вправо на 1 бит: 0 0000 0010
P + S = 10100010 Сдвиг вправо на 1 бит: 1101 0001
P + A = 1 0010 0001 здесь 1 - сгенерированный перенос
сдвиг вправо на 1 бит: 110010000
Оставьте младший бит: 11001000 (не равно 20)