二进制中1的个数

输入一个整数,输出该数二进制表示下1的个数

暴力方法

在不借助Java的API的情况下要完成这道题的一个思路是循环统计各位是否为1。可能有人会想先将这个整数转换为字符串表示的二进制再来统计1的个数。但是想想整数在计算机中本身就是存储为二进制数的,比如7,二进制为111,借助大多数高级语言都有的右移操作运算符便可完成这道题

public int NumberOf1(int n) {
    int count = 0;
    // 需要右移32次 
    int x = 32;
    while (x-- != 0) {
        count += n & 1;
        n >>= 1;
    }
        
    return count;
}

讨论区里更好的解法

public int NumberOf1(int n) {
    int count = 0;
    while (n != 0) {
        n = n & (n - 1);
        count += 1;
    }
    return count;
}

这个解法的思路妙在n = n & (n - 1)这行代码上,举个栗子:假设n = 12,二进制表示为1100,n-1 = 11,二进制表示为1011,两者相与为1000,不难发现,在n的二进制表示中最右边的1开始都变为了0。再在外面套个循环,相当于说能进行多少次这样的操作,也就是有多少个1

推荐阅读更多精彩内容