Сдвиг влево (BusSHL)

Входы (Inputs)

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

Выходы (Outputs)

ПинТипОписание
Qbus8(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)
000000113000001106
0000010150000101010
10000000128000000000
1111111125511111110254

Применение

В АЛУ (уровень 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.