Алгоритм Бута

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Алгоритм умножения Бута — это алгоритм умножения, который позволяет перемножить два двоичных числа в дополнительном коде. Алгоритм был разработан Эндрю Дональдом Бутом в 1951 году при проведении исследований в области кристаллографии в колледже им. Дж. Бирбека в Блумсбери (Лондон). Бут пользовался настольными вычислителями, которые выполняли операцию сдвига быстрее, чем операцию сложения, и создал алгоритм для увеличения скорости их работы. Алгоритм Бута представляет интерес при изучении архитектуры компьютера.

Алгоритм[править | править код]

Алгоритм Бута включает в себя циклическое сложение одного из двух заранее установленных значений и с произведением , а затем выполнение арифметического сдвига вправо над .
Пусть и  — множимое и множитель соответственно, а и представляют собой количество битов в и соответственно.

  1. Установить значения и , а также начальное значение . Каждое из этих чисел должно иметь длину, равную ().
    1. : Заполнить наиболее значимые (левые) биты значением . Заполнить оставшиеся () бит нулями.
    2. : Заполнить наиболее значимые биты значением () в дополнительном коде. Заполнить оставшиеся () бит нулями.
    3. : Заполнить наиболее значимые бит нулями. Справа от них заполнить биты значением . Записать в крайний наименее значимый (правый) бит.
  2. Определить значение двух наименее значимых (правых) битов и вычислить по ним значение для следующего шага:
    1. Если их значение равно , прибавить к . Переполнение игнорировать.
    2. Если их значение равно , прибавить к . Переполнение игнорировать.
    3. Если их значение равно , действие не требуется. используется без изменений на следующем шаге.
    4. Если их значение равно , действие не требуется. используется без изменений на следующем шаге.
  3. Выполнить операцию арифметического сдвига над значением, полученным на втором шаге, на один бит вправо. Присвоить это новое значение.
  4. Повторить шаги 2 и 3 раз.
  5. Отбросить крайний наименее значимый (правый) бит . Это и есть произведение и .

Пример[править | править код]

Вычислить . В этом случае :

  • Выполним цикл 4 раза :
    1. P = 0000 1100 0. Крайние два бита равны 00.
      • P = 0000 0110 0. Арифметический сдвиг вправо.
    2. P = 0000 0110 0. Крайние два бита равны 00.
      • P = 0000 0011 0. Арифметический сдвиг вправо.
    3. P = 0000 0011 0. Крайние два бита равны 10.
      • P = 1101 0011 0. P = P + S.
      • P = 1110 1001 1. Арифметический сдвиг вправо.
    4. P = 1110 1001 1. Крайние два бита равны 11.
      • P = 1111 0100 1. Арифметический сдвиг вправо.
  • Произведение равно 1111 0100 (−12 в десятичной системе)

Вышеупомянутой техники недостаточно, когда множимое является наибольшим по модулю отрицательным числом, которое может быть представлено в текущей разрядной сетке (например, если размер множимого 4 бита, то это значение равно ). Один из возможных способов решить эту проблему — добавить один дополнительный бит слева от , и . Ниже мы покажем усовершенствованную технику на примере умножения на 2 используя по 4 бита под множимое и множитель:

  • Выполним цикл 4 раза :
    1. P = 0 0000 0010 0. Крайние два бита равны 00.
      • P = 0 0000 0001 0. Арифметический сдвиг вправо.
    2. P = 0 0000 0001 0. Крайние два бита равны 10.
      • P = 0 1000 0001 0. P = P + S.
      • P = 0 0100 0000 1. Арифметический сдвиг вправо.
    3. P = 0 0100 0000 1. Крайние два бита равны 01.
      • P = 1 1100 0000 1. P = P + A.
      • P = 1 1110 0000 0. Арифметический сдвиг вправо.
    4. P = 1 1110 0000 0. Крайние два бита равны 00.
      • P = 1 1111 0000 0. Арифметический сдвиг вправо.
  • После отбрасывания крайних бит получаем значение произведения: 11110000 (−16 в десятичной системе).

Как это работает[править | править код]

Рассмотрим положительный множитель, состоящий из блока единиц, окружённых нулями, например 00111110. Произведение определяется по формуле :

где  — множимое. Количество операций может быть уменьшено вдвое, если представить произведение следующим образом :

На самом деле, можно показать, что любая последовательность единиц в двоичном числе может быть разбита на разность двух двоичных чисел:

Таким образом, мы действительно можем заменить операцию умножения на последовательность единиц в исходном числе более простыми операциями: сложение со множителем, сдвиг частичного произведения, вычитание множителя. Алгоритм использует тот факт, что нам не нужно делать ничего кроме сдвига, когда очередной разряд в двоичном множителе равен нулю, а также простое математическое свойство: 99 = 100 − 1 при умножении на 99.

Эта схема может быть распространена на любое количество блоков единиц в множителе (включая случай одной единицы в блоке). Таким образом,

Алгоритм Бута следует этой схеме путём выполнения сложения, когда встречается первая цифра блока единиц (0 1), и вычитания, когда встречается конец блока единиц (1 0). Схема работает в том числе и для отрицательного множителя. Когда единицы в множителе сгруппированы в длинные блоки, алгоритм Бута выполняет меньше сложений и вычитаний, чем обычный алгоритм умножения.

Ссылки[править | править код]

Источники[править | править код]

  1. Оригинальная статья Booth’s multiplication algorithm
  2. Andrew D. Booth. A signed binary multiplication technique. The Quarterly Journal of Mechanics and Applied Mathematics, Volume IV, Pt. 2 [1]
  3. Collin, Andrew. Andrew Booth’s Computers at Birkbeck College. Resurrection, Issue 5, Spring 1993. London: Computer Conservation Society.
  4. 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.
  5. Stallings, William. Computer Organization and Architecture: Designing for performance, Fifth Edition. ISBN 0-13-081294-3. New Jersey: Prentice-Hall, Inc.. 2000.