Сдвиг вправо (BusSHR)

Входы (Inputs)

ПинТипОписание
Abus8Входная шина

Выходы (Outputs)

ПинТипОписание
Qbus8(A >>> 1) & 0xFF

Логика работы

Сдвиг вправо передвигает все биты шины на одну позицию вправо. Младший бит (bit 0) выдвигается за край и теряется, а на место старшего (bit 7) приходит ноль. Пример на байте: A = 00001100 (12) → Q = 00000110 (6).

Отсюда главное свойство операции: сдвиг вправо — это деление на 2 с отбрасыванием остатка. Цепочка 12 → 6 → 3 → 1 → 0 показывает, как быстро «сгорают» младшие биты. В двоичной системе сдвиги заменяют умножение и деление на степени двойки — так же, как лишний ноль справа в десятичной записи умножает число на 10.

Важный нюанс: BusSHR — логический сдвиг, слева всегда дописывается ноль. Для обычных неотрицательных чисел это именно то, что нужно. А вот бит знака не сохраняется: у отрицательного числа в дополнительном коде после сдвига слева окажется 0, и результат станет положительным.

Примеры (8 бит)

A (bin)A (dec)Q (bin)Q (dec)
0000110012000001106
000000011000000000
100000001280100000064
1111111125501111111127

Применение

В АЛУ (уровень 13) сдвиг — одна из базовых операций наряду с И, ИЛИ и сложением. Так процессор делит на 2, 4 и 8 без отдельного узла деления: три сдвига подряд дают деление на 8.

Вторая роль — выделение нужных битов. В Harvard-архитектуре (уровень 16) команда хранится в одном байте: старшие 4 бита — код операции, младшие — операнд. Сдвинув байт команды вправо на 4, процессор получает опкод, а оставшиеся младшие биты — операнд. Тот же приём читает нажатия геймпада и переключатели: сдвигай вправо, пока нужный бит не окажется на позиции 0, и накладывай маску через BusAND.

Собери это сам →

Смежные компоненты

Статьи по теме

Частые вопросы

Что происходит с выдвинутым битом?

Он теряется: сдвиг вправо — это деление на 2 с отбрасыванием остатка.

Как разделить число на 8 с помощью сдвигов?

Три последовательных сдвига вправо: каждый уменьшает число вдвое, а 2 × 2 × 2 = 8. Одна операция деления заменяется тремя дешёвыми сдвигами.

Что вернёт сдвиг отрицательного числа?

BusSHR дописывает слева ноль, поэтому знак он не сохраняет: 11111111 (минус 1 в дополнительном коде) превратится в 01111111 (127). Для знаковых чисел нужен арифметический сдвиг, копирующий бит знака, — в наборе компонентов его нет.