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

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

求解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;
} 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值