1.1乘法的位移方法
乘法
,2的整数倍直接移位
a = b * 4;
a = b<<2;
非整数倍也可以拆成整数倍的移位相加
a = b * 5;
a = (b<<2) + (b<<0);
1.2除法的位移方法
除法
,2的整数倍直接移位
a = a / 4;
a = a >> 2;
非2的整数倍需要变换一下,算法精度和放大的倍数有关,下面的例子是0x400000。
原理是用一个远远大于除数,并且是2的整数倍的数,先乘再除,除数被消除变成乘数,后面的除法是2的倍数可以直接位移,这样就把非2整除法变成了乘法和可以位移的2整除法
a/3600
= a * 0x400000 /3600 / 0x400000
= a * (0x400000 /3600) / 0x400000
= a * 1165 >> 22
= a * 0b10010001101 >> 22
= ((a << 10) + (a << 7) + (a << 3) + (a << 2) + (a << 0))>>22
= (a >> 12) + (a >> 15) + (a >> 19) + (a >> 20) + (a >> 22)
1.3取模的位移方法
取模
,即被除数减去除数和商的积
a % 8
= a - a/8*8
= a - (a>>8<<8)
1.4浮点运算的位移方法
- 浮点,适用于常量,直接定义被放大后的小数,运算完成后再缩小
#define pi (3.14*256)
a * 3.14
= a * pi >> 8