背景:
以往,在大多数机器上,整数乘法指令相当慢,需要 10 个或者更多的时钟周期,然而其他整数运算(例如加法、减法、位级运算和移位)只需要 1 个时钟周期。即使在我们的参考机器 Intel Core i7HaSwell 上,其整数乘法也需要 3 个时钟周期。因此,编译器使用了一项重要的优化,试着用移位和加法运算的组合来代替乘以常数因子的乘法。
例子:
假设一个程序包含表达式 x*14。利用14=23+22+21, 编译器会将乘法重写为(x<<3)+(x<<2)+(x<<1),将一个乘法替换为三个移位和两个加法。无论 x 是无符号的还是补码,甚至当乘法会导致溢出时,两个计算都会得到一样的结果。(根据整数运算的属性可以证明这一点。)更好的是,编译器还可以利用属性 14=24-21,将乘法重写为
(x<<4)-(x<<1),这时只需要两个移位和一个减法。
笔记:整数乘法 乘以常数 一种移位和加法运算的组合的方法
最新推荐文章于 2021-09-11 18:36:10 发布