利用位运算求数值的整数次方

算法比较简单,可以举例说明。

求解2^11次方,11的二进制表示为:1101, 每一位分别代表2^3, 2^2, 2^1, 2^0,  2^11, 即:8, 4 ,2 ,1. 

所以2^11 = 2^(8*1+4*1+0*2+1*1) = 2^8 * 2^4 * 2^0 * 2^1

所以我们只要求出每一位所代表的数字(2^n), 以及这一位为0还是为1。


#include<iostream>
using namespace std;
int main()
{
    int exponent;
    double base;
    cout<<"base = ";
    cin>>base;
    cout<<"exponent = ";
    cin>>exponent;
    
    double sum = 1;//记录最终的答案 
    double tmp = base;//防止base被改动 
    
    int mult = 1;//指示指数的符号 
    int fact = 1;//指示基数的符号 
     
    if(base == 0)//基数不为0 
    {
            cout<<"base should larger than Zero!"<<endl;
            system("pause");
            return 0;
    }
    if(exponent == 0)//指数为0,幂 = 1; 
    {
         cout<<"sum = 1"<<endl;
         system("pause");
         return 0;
    }
    if(tmp<0 && exponent%2==1)//如果基数为负数,且指数为奇数,那么最后答案为负数 
    {
              fact = -1;
              tmp = -tmp; 
    } 
    if(exponent < 0)//指数小于0的话,指数取绝对值,最后答案取倒数 
    {
                mult = -1;
                exponent = abs(exponent);
    }
    //=====================================Main parts
    while(exponent)//循环右移
    {
            if(exponent&0x01)//如果最低位是1,那么表示这一位需要计算
            {
                      sum *= tmp;
            }
            tmp *=tmp;
            exponent = exponent>>1;               
    }
    //===============================================
    if(mult == 1)
            cout<<"sum = "<<sum*fact<<endl;
    else
        cout<<"sum = "<<1<<"/"<<sum*fact<<endl;
    system("pause");
    return 0;
} 


你可能感兴趣的:(算法,System)