Interested Article - Алгоритм Бута
- 2021-12-14
- 1
Алгоритм умножения Бута — это алгоритм умножения , который позволяет перемножить два двоичных числа в дополнительном коде . Алгоритм был разработан Эндрю Дональдом Бутом в 1951 году при проведении исследований в области кристаллографии в колледже им. Дж. Бирбека в Блумсбери ( Лондон ). Бут пользовался настольными вычислителями, которые выполняли операцию сдвига быстрее, чем операцию сложения, и создал алгоритм для увеличения скорости их работы. Алгоритм Бута представляет интерес при изучении архитектуры компьютера .
Алгоритм
Алгоритм Бута включает в себя циклическое сложение одного из двух заранее установленных значений
и
с произведением
, а затем выполнение
арифметического сдвига
вправо над
.
Пусть
и
— множимое и множитель соответственно, а
и
представляют собой количество
битов
в
и
соответственно.
-
Установить значения
и
, а также начальное значение
. Каждое из этих чисел должно иметь длину, равную (
).
- : Заполнить наиболее значимые (левые) биты значением . Заполнить оставшиеся ( ) бит нулями.
- : Заполнить наиболее значимые биты значением ( ) в дополнительном коде . Заполнить оставшиеся ( ) бит нулями.
- : Заполнить наиболее значимые бит нулями. Справа от них заполнить биты значением . Записать в крайний наименее значимый (правый) бит.
-
Определить значение двух наименее значимых (правых) битов
и вычислить по ним значение для следующего шага:
- Если их значение равно , прибавить к . Переполнение игнорировать.
- Если их значение равно , прибавить к . Переполнение игнорировать.
- Если их значение равно , действие не требуется. используется без изменений на следующем шаге.
- Если их значение равно , действие не требуется. используется без изменений на следующем шаге.
- Выполнить операцию арифметического сдвига над значением, полученным на втором шаге, на один бит вправо. Присвоить это новое значение.
- Повторить шаги 2 и 3 раз.
- Отбросить крайний наименее значимый (правый) бит . Это и есть произведение и .
Пример
Вычислить . В этом случае :
-
Выполним цикл 4 раза :
-
P = 0000 110
0 0
. Крайние два бита равны 00.
- P = 0000 0110 0. Арифметический сдвиг вправо.
-
P = 0000 011
0 0
. Крайние два бита равны 00.
- P = 0000 0011 0. Арифметический сдвиг вправо.
-
P = 0000 001
1 0
. Крайние два бита равны 10.
- P = 1101 0011 0. P = P + S.
- P = 1110 1001 1. Арифметический сдвиг вправо.
-
P = 1110 100
1 1
. Крайние два бита равны 11.
- P = 1111 0100 1. Арифметический сдвиг вправо.
-
P = 0000 110
0 0
. Крайние два бита равны 00.
- Произведение равно 1111 0100 (−12 в десятичной системе)
Вышеупомянутой техники недостаточно, когда множимое является наибольшим по модулю отрицательным числом, которое может быть представлено в текущей разрядной сетке (например, если размер множимого 4 бита, то это значение равно ). Один из возможных способов решить эту проблему — добавить один дополнительный бит слева от , и . Ниже мы покажем усовершенствованную технику на примере умножения на 2 используя по 4 бита под множимое и множитель:
-
Выполним цикл 4 раза :
-
P = 0 0000 001
0 0
. Крайние два бита равны 00.
- P = 0 0000 0001 0. Арифметический сдвиг вправо.
-
P = 0 0000 000
1 0
. Крайние два бита равны 10.
- P = 0 1000 0001 0. P = P + S.
- P = 0 0100 0000 1. Арифметический сдвиг вправо.
-
P = 0 0100 000
0 1
. Крайние два бита равны 01.
- P = 1 1100 0000 1. P = P + A.
- P = 1 1110 0000 0. Арифметический сдвиг вправо.
-
P = 1 1110 000
0 0
. Крайние два бита равны 00.
- P = 1 1111 0000 0. Арифметический сдвиг вправо.
-
P = 0 0000 001
0 0
. Крайние два бита равны 00.
- После отбрасывания крайних бит получаем значение произведения: 11110000 (−16 в десятичной системе).
Как это работает
Рассмотрим положительный множитель, состоящий из блока единиц, окружённых нулями, например 00111110. Произведение определяется по формуле :
где — множимое. Количество операций может быть уменьшено вдвое, если представить произведение следующим образом :
На самом деле, можно показать, что любая последовательность единиц в двоичном числе может быть разбита на разность двух двоичных чисел:
Таким образом, мы действительно можем заменить операцию умножения на последовательность единиц в исходном числе более простыми операциями: сложение со множителем, сдвиг частичного произведения, вычитание множителя. Алгоритм использует тот факт, что нам не нужно делать ничего кроме сдвига, когда очередной разряд в двоичном множителе равен нулю, а также простое математическое свойство: 99 = 100 − 1 при умножении на 99.
Эта схема может быть распространена на любое количество блоков единиц в множителе (включая случай одной единицы в блоке). Таким образом,
Алгоритм Бута следует этой схеме путём выполнения сложения, когда встречается первая цифра блока единиц (0 1), и вычитания, когда встречается конец блока единиц (1 0). Схема работает в том числе и для отрицательного множителя. Когда единицы в множителе сгруппированы в длинные блоки, алгоритм Бута выполняет меньше сложений и вычитаний, чем обычный алгоритм умножения.
Ссылки
- in
Источники
- Оригинальная статья
- Andrew D. Booth. A signed binary multiplication technique. The Quarterly Journal of Mechanics and Applied Mathematics, Volume IV, Pt. 2
- Collin, Andrew. . Resurrection , Issue 5, Spring 1993. London: Computer Conservation Society.
- Patterson, David and John Hennessy. Computer Organization and Design: The Hardware/Software Interface, Second Edition . ISBN 1-55860-428-6 . San Francisco, California: Morgan Kaufmann Publishers. 1998.
- Stallings, William. Computer Organization and Architecture: Designing for performance, Fifth Edition . ISBN 0-13-081294-3 . New Jersey: Prentice-Hall, Inc.. 2000.
- 2021-12-14
- 1