1

我想知道当我做 4<<2 时,下面到底发生了什么?是否执行任何乘法运算或如何计算值。如果您对移位运算符的实现有参考,请回复我。提前致谢

4

5 回答 5

5

通常这是一条处理器指令(直接在处理器上完成)。

它只是移动内存中的位:

int a = 3; // a = 0 0 1 1
a << 1;    // a = 0 1 1 0 = 6
a << 1;    // a = 1 1 0 0 = 12

如果您正在寻找有关处理器如何在非常低的级别上工作的见解, Charles Petzold 的Code是一本很棒的书。

于 2010-09-29T16:23:52.537 回答
3

在您的特定情况下,编译器会将其简化为常量,但通常处理器的指令集包括特殊的操作码(操作码、命令)来执行位移操作。

这是如何工作的很好的解释。

于 2010-09-29T16:21:21.073 回答
1

在硬件方面,每个输出位都是通过选择一个输入位生成的。不需要乘法器,只需大量的多路复用。

于 2010-09-29T16:22:33.837 回答
1

值得注意的是,有些处理器的指令可以在固定的时间内位移任意数量,有些处理器的指令可以位移可变数量但需要可变数量的时间来完成(因此向左移动 31 位可能花点时间),而其他的则仅限于一次移动一位的指令。虽然人们通常不应该担心这种繁琐的实现细节,但实现共同结果的各种方式之间可能存在巨大的性能差异。

例如,使用 (1<

  如果 (shift_amount & 16)
    长变量 >>= 16;
  如果 (shift_amount & 8)
    长变量 >>= 8;
  如果 (shift_amount & 4)
    长变量 >>= 4; /* 如果处理器对此进行了优化 */
  longvar >>= (shift_amount & 3);

如果存在用于快速移位的指令,则完全适得其反,但在某些 8 位机器上可能会有巨大的加速(6 倍或更高)。

于 2010-09-29T17:45:09.273 回答
0

所有处理器都可能有移位指令,这里是它们的汇编语言对应物的一些示例。

于 2010-09-29T16:22:01.077 回答