把b转换成
二进制数。
该二进制数第i位的权为例如
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算
快速幂可以用位运算这个强大的工具实现
1
|
b
and
1
{也就是取b的二进制最低位(即第0位) 判断b是否为奇数,是则为1}
|
1
|
b
shr
1
{就是去掉b的二进制最低位(即第0位)}
|
有了这个强大的工具,快速幂就好实现了!
常规求幂
int
pow1(inta,intb)
{
int
r=1;
while
(b--)
r*=a;
return
r;
}
二分求幂(一般)
int
pow2(inta,intb)
{
int
r=1,base=a;
while
(b!=0)
{
if
(b%2)
r*=base;
base*=base;
b/=2;
}
return
r;
}
快速求幂(位操作)
int
pow3(
int
a,
int
b)
{
int
r=1,base=a;
while
(b!=0)
{
if
(b&1)
r*=base;
base*=base;
b>>=1;
}
return
r;
}
快速求幂(位运算,同pow3函数,但更复杂)
int
pow4(
int
x,
int
n)
{
if
(n==0)
return
1;
else
{
while
((n&1)==0)
{
n>>=1;
x*=x;
}
}
int
result=x;
n>>=1;
while
(n!=0)
{
x*=x;
if
((n&1)!=0)
result*=x;
n>>=1;
}
return
result;
}