做Leetcode剑指offer第16题数值的整数次方问题时,解答如下:
class Solution {
public:
double myPow(double x, int n) {
double res = 1;
unsigned int m =(unsigned int)n;
if(n < 0)
{
x = 1/x;
m = -m;
}
while(m)
{
if(m & 1 == 1) /*奇数情况*/
res = res * x ;
x = x * x;
m >>= 1;
}
return res;
}
};
该代码有一段
unsigned int m =(unsigned int)n;
if(n < 0)
{
x = 1/x;
m = -m;
}
这段代码的作用是对n取反。
原因在于该题给的样例中,有这么一个
1.00000
-2147483648
如果直接采用加负号取反的话,会超过int变量的范围,从而报错。
这里的做法是先将int变量强制转换为unsined int型变量,然后再对unsigend int变量取反。
而无符号数取反的规则是:
例如:-2的二进制补码表示是:11111111111111111111111111111110
将其强制转换为unsigen int型11111111111111111111111111111110,对应值为4294967294。
将该无符号数取反:2^32-4294967294 = 2
附:无符号加法
无符号乘法