剑指Offer10-二进制中1的个数

题目:

/**
     * 请实现一个函数,输入一个整数,
     * 输出该二进制表示中1的个数。
     * 例如把9表示成二进制是1001, 有2位是1。
     * 因此如果输入9,该函数输出2。
     */

解题思路:常规的解法可以去遍历整数对应二进制的每一位,比如:数字9的二进制1001,依次将每一位的数字与1进行 与 运算,若结果为1则表明对应的位数为1;

然后去累积计算1的总体个数。

代码如下:

public class No10 {
    public static void main(String[] args) {
        System.out.println(getNum(9));
        
    }
    
    public static int getNum(int num) {
        int count = 0;        //累加器:保存二进制中的个数
        int flag = 1;        //变量,每次循环左移一位
        
        while(flag!=0) {
            //与运算不等于0说明出现了当前二进制位为1的情况
            if((num & flag) != 0)
                count++;
            flag = flag << 1;
        }
        return count;
    }
}

但是因为int在内存中站32位,故这种方法为循环32次;

有没有一种方法是二进制中有多少个1就循环几次;

答案是有的:首先要知道一个知识点:把一个整数减去1,然后把减去一的结果与该整数做运算,就会把最右边的1变成0,由此可以统计二进制中1的个数

代码如下:

public class No10 {
    public static void main(String[] args) {
        System.out.println(getNum(9));
        
    }
    
    public static int getNum(int num) {
        int count = 0;
        while(num != 0) {
            num = (num-1) & num;
            count++;
        }
        return count;
    }
}

 

posted @ 2018-06-27 15:56  meteorst  阅读(135)  评论(0编辑  收藏  举报