Некоторые наборы команд ограничены одним битовым сдвигом на инструкцию. А некоторые наборы команд позволяют указывать любое количество битов для сдвига в одной инструкции, что обычно занимает один тактовый цикл на современных процессорах (современный - намеренно расплывчатое слово). См. ответ dan04 о переключателе ствола, схеме, которая сдвигает более одного бита за одну операцию.
Все сводится к логическому алгоритму. Каждый бит в результате является логической функцией, основанной на вводе. Для одного правого сдвига алгоритм будет выглядеть примерно так:
- Если инструкция [сдвиг вправо] и бит 1 входа равен 1, то бит 0 результата равен 1, иначе бит 0 равен 0.
- Если инструкция [сдвиг вправо], то бит 1 = бит 2.
- и т.д..
Но логическое уравнение может быть таким же простым:
- Если инструкция [сдвиг вправо] и операнд количества равен 1, то результирующий бит 0 = сдвинутый входной бит 1.
- если значение равно 2, то бит 0 = бит 2.
- и т. Д.
Логические вентили, будучи асинхронными, могут делать все это за один такт. Тем не менее, это правда, что единственная смена позволяет ускорить цикл и сократить количество гейтов, если вы сравниваете только эти два варианта инструкции. Или же альтернатива заключается в том, что для выполнения процедуры требуется больше времени, поэтому инструкция занимает 2 или 3 такта или что-то в этом роде, а логика считает 3, а затем фиксирует результат.
Например, MSP430 имеет только однобитовые команды поворота вправо (потому что вы можете выполнить однобитовый сдвиг или поворот влево с помощью другой инструкции, которую я оставлю читателю для выяснения).
Набор команд ARM допускает как немедленное, так и регистровое многобитовое вращение, арифметические и логические сдвиги. Я думаю, что есть только одна действительная команда поворота, а другая является псевдонимом, потому что поворот влево 1 аналогичен повороту вправо 32, вам нужно только однонаправленное переключение барреля для реализации многобитового поворота.
SHL в x86 допускает более одного бита на инструкцию, но раньше он занимал более одного такта.
и т. Д., Вы можете легко изучить любую из имеющихся там инструкций.
Ответ на ваш вопрос заключается в том, что он не является фиксированным. Иногда это одна операция, один цикл, одна инструкция. Иногда это одна инструкция нескольких тактов. Иногда это несколько инструкций, несколько тактов.
Компиляторы часто оптимизируют для такого рода вещей. Скажем, у вас есть набор 16-битных регистров с байт-инструкцией подкачки и инструкция AND с немедленным, но только однобитовым сдвигом. Вы можете подумать, что для сдвига 8 битов потребуется 8 циклов смены команд, но вы можете просто поменять местами байты (одну инструкцию), а затем И нижнюю половину на нули (что может занять две инструкции или может быть инструкция переменной длины слова из двух слов, или он может быть закодирован в одну инструкцию), поэтому он занимает всего 2 или 3 цикла команд / тактов вместо 8. Для сдвига в 9 битов вы можете сделать то же самое и добавить сдвиг, сделав его 9 тактов против 3 или 4 Кроме того, на некоторых архитектурах умножение на 256 быстрее, чем сдвиг на 8 и т. Д. И т. Д. Каждый набор инструкций имеет свои ограничения и приемы.
Это даже не тот случай, когда либо большинство наборов инструкций предоставляют многобитовые, либо большинство ограничивается одним битом. Процессоры, относящиеся к категории «компьютер», такие как X86, ARM, PowerPC и MIPS, склоняются к одной операции на смену. Расширение на все процессоры, но не обязательно на «компьютеры», обычно используемые сегодня, и оно сдвигается в другую сторону, я бы сказал, что большинство из них являются однобитными, а не многобитными, поэтому для выполнения многобитового сдвига требуется несколько операций.