快速乘: 避免使用乘法,通过位运算来实现乘法;
实现快速乘的思路:
计算A*B:
方法为:对乘数进行拆分,如果是B是偶数(与1做&运算法,结果是0),就让A左移一位(乘2),然后B右移一位(除2);若果B是奇数(与1做&运算法,结果非0),就让结果集加上一个A(等价于让B-1),然后继续进行拆分,循环截止的条件是B为0。
通过公式来表示:
A
∗
B
=
{
(
A
<
<
1
)
∗
(
B
>
>
1
)
,
B为偶数
(
A
<
<
1
)
∗
(
B
>
>
1
)
+
A
,
B为奇数
A*B = \begin{cases} (A<<1)*(B>>1), & \text{B为偶数} \\ (A<<1)*(B>>1) + A, & \text{B为奇数} \end{cases}
A∗B={(A<<1)∗(B>>1),(A<<1)∗(B>>1)+A,B为偶数B为奇数
注意: 奇数需要在结果集加一个A,是为了弥补 右移丢失的精度
int multiply(int A, int B) {
int ans = 0;
for(; B != 0; B >>= 1){
if(B & 1){
ans += A;
}
A <<= 1;
}
return ans;
}