天天看点

JZ11 二进制中1的个数

JZ11 二进制中1的个数

 这道题的前置知识:

  1. 十进制如何转成二进制
  2. 无符号数与有符号数
  3. 左移右移对原数的影响

问题1:商重复除2取模,模数最后倒置

JZ11 二进制中1的个数

问题3:一般都是左右移位补0,但是负数不一样,右移补1 因为第一位是符号位

具体思路:将10进制数与1进行&运算,如果10进制数最右边的二进制为1结果为1,为0结果为0

然后继续进行一个右移操作,前边补0【这种情况未考虑负数】【不右移用除法也可以但是与运算更快】

既然右移不行那就,1进行左移,后边补0,再做与运算,左移之后的1就能判断原数相应的2进制位是0还是1

JZ11 二进制中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

JZ11 二进制中1的个数

 时间 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

题意要逐字看,是哪个数在左移

短短几行代码看了一个多小时

继续阅读