
这道题的前置知识:
- 十进制如何转成二进制
- 无符号数与有符号数
- 左移右移对原数的影响
问题1:商重复除2取模,模数最后倒置
问题3:一般都是左右移位补0,但是负数不一样,右移补1 因为第一位是符号位
具体思路:将10进制数与1进行&运算,如果10进制数最右边的二进制为1结果为1,为0结果为0
然后继续进行一个右移操作,前边补0【这种情况未考虑负数】【不右移用除法也可以但是与运算更快】
既然右移不行那就,1进行左移,后边补0,再做与运算,左移之后的1就能判断原数相应的2进制位是0还是1
代码实现:
public class Solution {
public int NumberOf1(int n) {
int num=0;
int value=1;
while(value!=0)
{
if((value&n)!=0)
num++;
value <<= 1;
System.out.print(value&n);
}
return num;
}
}
时间O(32) 空间O(1)
更加巧妙的方法,原数-1 然后两数作与运算结果为x,直到x为0
时间 O(X) x为二进制中一的个数
public class Solution {
public int NumberOf1(int n) {
int num=0;
while(n!=0)
{
n=n&(n-1);
num++;
}
return num;
}
}
总结自己看:导致自己在这道题花费较多的时间就是
if((value&n)!=0) 与运算之后不是==1
题意要逐字看,是哪个数在左移
短短几行代码看了一个多小时