快速幂算法

常规求幂

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int pow1(int a,int b)  
  2. {  
  3.     int r=1;  
  4.     while(b--)  
  5.         r*=a;  
  6.     return r;  
  7. }   

二分求幂(一般)

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int pow2(int a,int b)  
  2. {  
  3. int r=1,base=a;  
  4. while(b!=0)  
  5. {  
  6.     if(b%2)    //二进制
  7.         r*=base;      
  8.     base*=base;     //未保存的“打表”
  9.     b/=2;  
  10. }  
  11. return r;  
  12. }  

二分求幂(位操作,同pow2)

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int pow4(int a,int b)  
  2. {  
  3.     int r=1,base=a;  
  4.     while(b!=0)  
  5.     {  
  6.         if(b&1)  
  7.             r*=base;  
  8.         base*=base;  
  9.         b>>=1;  
  10.     }  
  11.     return r;  
  12. }  


快速求幂(位运算,更复杂)

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int pow3(int x,int n)  
  2. {  
  3.     if(n==0) return 1;  
  4.     else  
  5.     {  
  6.         while((n&1)==0)  
  7.         {  
  8.             n>>=1;  
  9.             x*=x;  
  10.         }  
  11.     }  
  12.     int result=x;  
  13.     n>>=1;  
  14.     while(n!=0)  
  15.     {  
  16.         x*=x;  
  17.     if((n&1)!=0)  
  18.         result*=x;  
  19.     n>>=1;  
  20.     }  
  21.     return result;  
  22. }  

与运算:& 
两者都为1为1,否则为0 
1&1=1, 1&0=0, 0&1=0, 0&0=0

或运算:| 
两者都为0为0,否则为1 
1|1 = 1, 1|0 = 1, 0|1 = 1, 0|0 = 0

非运算:~ 
1取0,0取1 
~1 = 0, ~0 = 1 
~(10001) = 01110

异或运算 
两者相等为0,不等为1 
1^1=0, 1^0=1, 0^1=1, 0^0=0

移位运算 右移一位相当于除2,右移n位相当于除以2的n次方。

45>>2 //45右移两位

45的二进制为:101101 

右移两位就为: 001011

001011再转化为十进制为:11

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值