您的位置:首页 > 其它

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

2012-08-21 19:42 316 查看
算法比较简单,可以举例说明。

求解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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: