剑指Offer-题15(Java版):二进制中1的个数

参考自:《剑指Offer——名企面试官精讲典型编程题》

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

主要思路:把一个整数减去1,都是把最右边的1变为0。如果它的右边还有0,则其右边所有的0变为1,其左边的所有位保持不变。因此,把一个整数和它减去1的结果做位与运算,相当于把它最右边的1变为0,如此运算,直到该数变为0,则运算的次数即为1的个数。
例如:1100 ; 1100-1 =1011; 1100&1011 =1000

扩展:该方法也可以用于判断某个整数是不是2的幂次方,即该整数在二进制表示中是否只有1个1。

关键点:位运算

时间复杂度:O(n),n为所求数中1的个数

public class NumberOfOneInBinary
{
    public static void main(String[] args)
    {
        int n = 9;
        System.out.println(numberOfOne(n)); //2
        int n1 = 0x7FFFFFFF;
        System.out.println(numberOfOne(n1)); //31
    }

    private static int numberOfOne(int n)
    {
        int count = 0;
        while (n != 0)
        {
            n = n & (n - 1);
            ++count;
        }
        return count;
    }
}

猜你喜欢

转载自blog.csdn.net/m0_37862405/article/details/80158569