我想知道当我做4<< 2时,究竟发生了什么?是否进行了任何乘法或如何计算值。如果您参考移位运营商的实施,请回复我。提前致谢
答案 0 :(得分: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是一本很棒的书。
答案 1 :(得分:3)
在您的特定情况下,编译器会将其缩写为常量,但通常,指令集处理器包括执行位移操作的特殊操作码(操作代码,命令)。
Here's good explanation这是如何运作的。
答案 2 :(得分:1)
在硬件方面,通过选择一个输入位生成每个输出位。不需要乘法器,只需要很多多路复用。
答案 3 :(得分:1)
值得注意的是,某些处理器的指令可以在固定的时间内移位任何数量,有些处理器的指令可以移动可变数量,但需要花费不同的时间来执行此操作(因此需要移动一些内容) 31位可能需要一段时间),而其他的仅限于一次移位一位的指令。虽然人们通常不应该担心这种繁琐的实现细节,但是在实现共同结果的各种方式之间可能会有一些巨大的性能差异。
例如,使用(1&lt;
if (shift_amount & 16) longvar >>= 16; if (shift_amount & 8) longvar >>= 8; if (shift_amount & 4) longvar >>= 4; /* If processor has optimization for this */ longvar >>= (shift_amount & 3);
如果存在快速移位的指令,则可能会产生相反的效果,但在某些8位计算机上可能会出现巨大的加速(6倍或更高)。
答案 4 :(得分:0)
所有处理器可能都有移位指令,here是汇编语言对应的一些示例。