首先下面是c中的位移指令:
shl -逻辑左移指令
shr -逻辑右移指令
移位快,不过只能是乘2的次方数 > > 1 == *2 > > 2 == *4 > > 3 == *8 ....
不过即使我们使用乘法,一般编译器会自动优化
比如
int a = 1;
0041138E mov dword ptr [a],1
int b = a * 4;
00411395 mov eax,dword ptr [a]
00411398 shl eax,2 // 编译器优化了
0041139B mov dword ptr [b],eax
如果编译器没有进行优化,那么乘法一般时用移位+加法来完成的,例如P = A * B,可以这样做:
P = 0;
for the i 's bit of B
if (bi) P += A < < i
有理数、实数等等也是类似的做法,只不过是用小数的二进制表示法代替整数的。
对于内建类型,直接调用一条汇编指令,如果硬件直接支持的情况下,复杂数据的乘法会比自己写移位算法更快(硬件乘法做一次有比较独立的时长,如十几个时钟周期,因为数据是一次读入,并且在硬件内部实现的;这样就会比代码写成的多次指令、多次读写要快。而现在的硬件基本都是直接支持的。)当然,只做一、二次移位的*2,*3等等肯定还是移位的方案快。此外,对于非内建类型(如大数乘法),还是移位+加法要快,因为此时即使用乘法,也要调用很多次,就远远比不上移位了。