输入一个整数,输出该数二进制表示下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