1. 程式人生 > >C/C++ 位移與乘除法的換算

C/C++ 位移與乘除法的換算

      使用位移運算可以提高因乘除運算帶來的效率的問題,它的缺點是存在精度損失且不直觀。

乘法

12 * 2 = 12 << 1
12 * 4 = 12 << 2
12 * 8 = 12 << 3
12 * 16 = 12 << 4
12 * 32 = 12 << 5
12 * 64 = 12 << 6
12 * 128 = 12 << 7
12 * 256 = 12 << 8
除法
12 / 2 = 12 >> 1
12 / 4 = 12 >> 2
12 / 8 = 12 >> 3
12 / 16 = 12 >> 4
12 / 32 = 12 >> 5
12 / 64 = 12 >> 6
12 / 128 = 12 >> 7
12 / 256 = 12 >> 8
      使用移位運算來避免乘法運算是一種常用技巧,不過乘數必須都是正整數,而且必須至少有一個是 2 的 n 次方,例如:2,4,8,16,32……移位運算的特點是速度快,而乘法運算速度較慢,把乘法運算轉化為移位運算可以稍微提高程式執行效率。例如:
num *= 32;  
//等同於  
num <<= 5; /* 2 的 5 次方等於 32 */  
//如果乘數不是 2 的 n 次方,我們可以把乘數分解成幾個 2 的 n 次方的和:  
num *= 20;   
//等於  
num *= (16 + 4);  
//等於  
num = num * 16 + num * 4;   
//等於  
num = (num << 4) + (num << 2);