①例如求两个数a*b
小学里我们把这道式子看成是b个a的相加,现在我们把b变成一个二进制的式子 ex:3*53->可以看成3*(110101)->3*(100000*1+10000*1+1000*0+100*1+10*0+1*1)
对于判断b的对应的二进制的每个位是1或是0,这里用到b&1可以判断当前位是1或0;
下面贴函数来理解
public int f(int a,int b)
{
int res=0; //用来记录每次b移位后的和;
while(b!=0)
{
if((b&1)!=0)
{
res+=a;
}
b>>=1;// 移位
a=(a+a); //更新a的值;
}
return res;
}
有了上面的基础,我们再扩展到a^b 对于a^b这里有所不同了 3^(100000*1+10000*1+1000*0+100*1+10*0+1*1)每次更新值后,记录值乘上更新后的a
public int multiply(int a,int b)
{
int res=1;
while(b!=0)
{
if((b&1)!=0)
{
res=f(res,a);
}
b>>=1;
a=f(a,a);
}
return res
}