思路

  • 十进制转换为二进制,进制转换:取模倒排法(高中数学),这里是%2,然后原数除以2
  • 位运算,除2可以转换为右移1,n&1二进制最低位的数字
  • lowbit函数,在树状数组结构中有一个函数名为lowbit函数 i&(i-1),,将最低位的1变成0;,比如 110变成100,由6变成4,4是小于6的最大的2的幂
    显然: 思路3>2>1
    再看看,Integer类的方法,lowesrOneBit()和highestOneBit() 分别是获得最小和最大的2个幂次的分量权重。
    比如6的二进制是110,分解为4+2+0,lowesrOneBit(6)=2,highestOneBit(6)=4;

代码

lowbit函数

public class Solution {
    public int NumberOf1(int n) {
        int cnt=0;
        while(n!=0){
            cnt++;
            n=n&(n-1); //n=n-Integer.lowestOneBit(n);  
        }
        return cnt;
    }
}