使用位移运算可以提高因乘除运算带来的效率的问题,它的缺点是存在精度损失且不直观。
乘法
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);