1、题目描述:
输入一个整数n,输出该数二进制表示中1的个数。
2、思路
设置一个变量flag,将flag与n做&运算,结果为1,则将个数加1。每循环一次,将flag左移一位,知道flag为0,停止循环,返回1的个数。代码如下:
public class Solution {
/**
正数和负数都可以
*/
public int NumberOf1(int n) {
int count = 0;
int flag = 1;
while(flag != 0){
if((n&flag) != 0){//将n的二进制与flag做与运算
count++;
}
flag = flag<<1;//将flag的二进制左移一位
}
return count;
}
}
3、更优秀的解法
上面的解法,是整数n的二进制有多少位,就要进行多少次循环,本题的方法是n的二进制中有多少1,就进行多少次循环,效率更高。具体思路是,将整数n减去1,再和原整数做与运算,会把该整数最右边的1变为0。代码如下:
public class Solution {
/**
正数和负数都可以,最好的解法
*/
public int NumberOf1(int n) {
int count = 0;
while(n != 0){
++count;
n = (n-1) & n;
}
return count;
}
}