某些指令集仅限于每条指令一位移位。某些指令集允许您在一条指令中指定要移动的任意数量的位,这在现代处理器上通常需要一个时钟周期(“现代”是一个故意模糊的词)。看dan04 的回答 https://stackoverflow.com/a/9083865/4098326关于桶形移位器,一种在一次操作中移位多个位的电路。
这一切都归结为逻辑算法。结果中的每一位都是基于输入的逻辑函数。对于单个右移,算法将类似于:
- 如果指令是[右移]且输入的位1为1,则结果的位0为1,否则位0为0。
- 如果指令是[右移],则位1 = 位2。
- etc.
但逻辑方程也可以很容易地表示为:
- 如果指令是[右移]并且数量操作数为1,则结果位0 = 移位的输入位1。
- 如果金额为 2,则位 0 = 位 2。
- 等等。
逻辑门是异步的,可以在一个时钟周期内完成所有这些工作。然而,如果您要比较的只是这两种类型的指令,那么单移确实可以实现更快的时钟周期和更少的门来稳定。或者替代方案是使其需要更长的时间才能稳定,因此指令需要 2 或 3 个时钟或其他时间,逻辑计数到 3,然后锁存结果。
例如,MSP430 仅具有单位右移指令(因为您可以使用另一条指令执行单位移位或左循环,我将留给读者自行解决)。
ARM 指令集允许立即数和基于寄存器的多位循环、算术移位和逻辑移位。我认为只有一个实际的旋转指令,另一个是别名,因为向左旋转1与向右旋转32相同,你只需要一个单向桶形移位器来实现多位旋转。
x86 中的 SHL 允许每条指令有多个位,但过去它需要多个时钟。
等等,您可以轻松检查其中列出的任何说明。
你的问题的答案是它不是固定的。有时是一次操作、一个周期、一条指令。有时它是一条指令多个时钟周期。有时它是多条指令、多个时钟周期。
编译器通常会针对此类事情进行优化。假设您有一个 16 位寄存器指令集,其中包含交换字节指令和带有立即数但只有单个位移位的 AND 指令。您可能认为移位 8 位需要 8 个移位指令周期,但您可以只交换字节(一条指令),然后将下半部分与零(这可能需要两条指令,或者可能是两个字的可变字长指令,或者它可能编码成一条指令),因此只需要 2 或 3 个指令/时钟周期而不是 8 个。对于 9 位的移位,您可以做同样的事情并添加一个移位,使其需要 9 个时钟而不是 3 或 4 个时钟周期.此外,在某些体系结构上,乘以 256 比移位 8 等更快。每个指令集都有其自己的限制和技巧。
甚至大多数指令集都提供多位或大多数限制为单个位的情况都不是这样。属于“计算机”类别的处理器,如 X86、ARM、PowerPC 和 MIPS,将倾向于一种操作来转换。扩展到所有处理器,但不一定是当今常用的“计算机”,并且它以另一种方式移位,我想说的是,其中更多的是单位而不是多位,因此需要多个操作来执行多位移位。