C/C++ 位移與乘除法的換算
阿新 • • 發佈:2019-02-15
使用位移運算可以提高因乘除運算帶來的效率的問題,它的缺點是存在精度損失且不直觀。
乘法
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……移位運算的特點是速度快,而乘法運算速度較慢,把乘法運算轉化為移位運算可以稍微提高程式執行效率。例如: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
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);