题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制1001,有2位1。因此如果输入9,该函数输出2。
基本思路:
解法一:首先把n和1做与运算,判断n的最低位是不是1。接着把1左移一位得到2,再和n做与运算,就能判断次低位是不是1...这样反复左移,每次都能判断n的其中一位是不是1。在这个解法中,循环的次数等于整数二进制表示的位数。
解法二:循环让(n - 1) & n。把一个整数减去一,再和原整数做与运算,会把原整数的最右边的1变成0。那么一个二进制整数表示中有多少个1,就要进行多少次这样的操作。其原理是不断清除n的二进制表示中最右边的1,同时累加计数器,直至n为0。因为从二进制的角度讲,n相当于在n - 1的最低位加上1。举个例子,8(1000)= 7(0111)+ 1(0001),所以8 & 7 = (1000)&(0111)= 0(0000),清除了8最右边的1(其实就是最高位的1,因为8的二进制中只有一个1)。再比如7(0111)= 6(0110)+ 1(0001),所以7 & 6 = (0111)&(0110)= 6(0110),清除了7的二进制表示中最右边的1(也就是最低位的1)。
解法一Java实现:
public class NumberOfOne {
public static int numberOfOne(int n) {
int count=0;
int flag=1;
//得到二进制表示
String s=Integer.toBinaryString(n);
for(int i=0;i<s.length();i++){
if((n&flag)==1)
count++;
flag=flag<<1;
}
return count;
}
}
解法二Java实现:
public class NumberOfOne {
public static int numberOfOne2(int n) {
// 记录数字中1的位数
int result = 0;
// 数字的二进制表示中有多少个1就进行多少次操作
while (n != 0) {
result++;
// 从最右边的1开始,每一次操作都使n的最右的一个1变成了0,
// 即使是符号位也会进行操作。
n = (n - 1) & n;
}
// 返回求得的结果
return result;
}
}