除法运算运算效率在四种基本运算中最慢,是乘法的20倍左右
所以在被除数为固定值时(重要),编译器会把除法优化乘法。
设代码 a/b = c b是常量
设 b*k = 2^n 2的n次直接用移位运算即可
a *2^n/ (b*2 ^n) = c
a * b *k/b = c* 2^n
a *k >> n = c
所以 a *k >> n = a/b //编译器会选择n的长度 从而保证后面位数舍弃时,造成的影响最小
让我们来看一下代码 //mul 寄存器(32位) = EDX (高位) EAX(低位)
a * 0x38E38E39 >> 33 = a / 9
b *k = 0x38E38E39 * 9 = 0x2 0000 0001= (2^33) +1 //这个值要大于2^33 所以求值时 2^n / b 要向上取整
直接取edx相当于 >>32 然后再sar edx,1
a如果是正数则无事发生
a如果是负数呢 //例如-0x10 -16
在内存中以补码存放 即 0xFFFFFFF0 //乘法加位移后
//imul 可能是用了补码乘法,或者用原码乘法//建议用原码乘法理