Сдвиг влево (BusSHL)
Входы (Inputs)
| Пин | Тип | Описание |
|---|---|---|
| A | bus8 | Входная шина |
Выходы (Outputs)
| Пин | Тип | Описание |
|---|---|---|
| Q | bus8 | (A << 1) & 0xFF |
Логика работы
BusSHL сдвигает все восемь битов шины на одну позицию влево. Младший бит (bit 0) освобождается, и на его место приходит ноль, а старший (bit 7) выталкивается за край и теряется. Пример на байте: A = 00000011 (3) → Q = 00000110 (6). Смотреть на сдвиг удобно как на бегущую строку: каждый бит переезжает на соседнее место левее, а хвост дописывается нулём.
Отсюда главное свойство: сдвиг влево — это умножение на 2. В двоичной записи каждый разряд весит вдвое больше соседа справа, поэтому переезд бита влево удваивает его вклад в число. Цепочка 3 → 6 → 12 → 24 удваивает значение на каждом шаге. Три сдвига подряд дают умножение на 8 — без единого узла умножения, одними проводами.
Тонкость: шина восьмибитная, и результат берётся по модулю 256. Если старший бит был единицей, он теряется — возникает переполнение: 10000000 (128) после сдвига даёт 00000000 (0). Все числа от 128 умножаются «с обрезкой», так что перед серией сдвигов стоит прикинуть, не вылезет ли результат за 255.
Примеры (8 бит)
| A (bin) | A (dec) | Q (bin) | Q (dec) |
|---|---|---|---|
| 00000011 | 3 | 00000110 | 6 |
| 00000101 | 5 | 00001010 | 10 |
| 10000000 | 128 | 00000000 | 0 |
| 11111111 | 255 | 11111110 | 254 |
Применение
В АЛУ (уровень 13) сдвиг влево стоит рядом с И, ИЛИ и сложением и закрывает умножение на степени двойки: ×2 — один сдвиг, ×4 — два, ×8 — три. Умножение на произвольное число раскладывается на сумму сдвигов: A × 5 = (A << 2) + A — то есть два сдвига и одно сложение. Настоящего умножителя процессору иметь не обязательно.
Вторая роль — сборка и разбор байтов. На уровне 19 «Шаг вперёд» сдвиг удваивает шаг счётчика команд с +1 до +2: команды занимают два байта, и ПК должен перепрыгивать через оба. А при формировании команды в Harvard-архитектуре (уровень 16) опкод сдвигается влево на 4 позиции — переезжает из младшей тетрады в старшую — и склеивается с операндом через BusOR. Без сдвига опкод и операнд так и остались бы соседями в одной тетраде.
Смежные компоненты
Статьи по теме
Частые вопросы
Почему сдвиг влево умножает число на 2?
Каждый сдвиг добавляет нулевой бит справа — в двоичной системе это удвоение числа.
Куда пропадает старший бит?
Он выходит за пределы восьмибитной шины и теряется. Для чисел от 128 это искажает результат: 10000000 (128) превращается в 00000000. Уход значения за границу разрядной сетки называют переполнением.
Как умножить число на 4 сдвигами?
Два BusSHL подряд: первый даёт ×2, второй — ещё ×2, итого ×4. Правило простое: N сдвигов = умножение на 2 в степени N.