Сдвиг вправо (BusSHR)
Входы (Inputs)
| Пин | Тип | Описание |
|---|---|---|
| A | bus8 | Входная шина |
Выходы (Outputs)
| Пин | Тип | Описание |
|---|---|---|
| Q | bus8 | (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) |
|---|---|---|---|
| 00001100 | 12 | 00000110 | 6 |
| 00000001 | 1 | 00000000 | 0 |
| 10000000 | 128 | 01000000 | 64 |
| 11111111 | 255 | 01111111 | 127 |
Применение
В АЛУ (уровень 13) сдвиг — одна из базовых операций наряду с И, ИЛИ и сложением. Так процессор делит на 2, 4 и 8 без отдельного узла деления: три сдвига подряд дают деление на 8.
Вторая роль — выделение нужных битов. В Harvard-архитектуре (уровень 16) команда хранится в одном байте: старшие 4 бита — код операции, младшие — операнд. Сдвинув байт команды вправо на 4, процессор получает опкод, а оставшиеся младшие биты — операнд. Тот же приём читает нажатия геймпада и переключатели: сдвигай вправо, пока нужный бит не окажется на позиции 0, и накладывай маску через BusAND.
Смежные компоненты
Статьи по теме
Частые вопросы
Что происходит с выдвинутым битом?
Он теряется: сдвиг вправо — это деление на 2 с отбрасыванием остатка.
Как разделить число на 8 с помощью сдвигов?
Три последовательных сдвига вправо: каждый уменьшает число вдвое, а 2 × 2 × 2 = 8. Одна операция деления заменяется тремя дешёвыми сдвигами.
Что вернёт сдвиг отрицательного числа?
BusSHR дописывает слева ноль, поэтому знак он не сохраняет: 11111111 (минус 1 в дополнительном коде) превратится в 01111111 (127). Для знаковых чисел нужен арифметический сдвиг, копирующий бит знака, — в наборе компонентов его нет.