题目1
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解答
public int NumberOf1(
int n) {
int c=
0;
while(n!=
0){
if((n&
1)==
1)c++;
n=n>>>
1;
}
return c;
}
需要注意的一点就是n应该用逻辑右移而不是算术右移,不然负数左边会补上1。
题目2
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
解答
链接:https:
来源:牛客网
/**
* 1.全面考察指数的正负、底数是否为零等情况。
* 2.写出指数的二进制表达,例如13表达为二进制1101。
* 3.举例:10^1101 = 10^0001*10^0100*10^1000。
* 4.通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。
*/
public double Power(
double base,
int n) {
double res =
1,curr = base;
int exponent;
if(n>
0){
exponent = n;
}
else if(n<
0){
if(base==
0)
throw new RuntimeException(
"分母不能为0");
exponent = -n;
}
else{
return 1;
}
while(exponent!=
0){
if((exponent&
1)==
1)
res*=curr;
curr*=curr;
exponent>>>=
1;
}
return n>=
0?res:(
1/res);
}
这里贴的是别人家的代码,因为写得比我好。 关键词:快速幂
举例:10^1101 = 10^0001*10^0100*10^1000。