17. 二进制中的1的个数
问题描述
请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。
分析
一个数内部都是0 1 ,我们要检测内部 1 的个数的话
我们可以将这个数不断右移,直到它为0 为止,提一下,这个是错误的,正数可以做出来,负数呢,右移之后补1 ,死循环了啊,扑街
-
常规解法
我们可以设置一个数 从1 开始,不断左移这个数,然后让他和n做比较,如果不为0 那就说明这个位上是1,这个方法有个缺点,就是循环的次数等于整数二进制中的位数,32位的整数需要循环32次
public static int NumberOf1Solution2(int n) { int count = 0; int flag = 1; while (flag >= 1) { if ((n & flag) > 0) { count++; } flag = flag << 1; } return count; }
-
有几个1就移动几次
假设我们 n = 3 换成二进制也就是 11 ,如果我们将这个数减1 判断它是不是与(n)相与结果为0的话,只需要减2次就行了刚好是其中1的个数,如果是 n = 4,也就是 100,我们将这个数减1(011),与(100)相与刚好为0,所以这个数中只有一个1 。
简言之就是:把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
public static int NumberOf1Solution3(int n) { int count = 0; while (n != 0) { count++; n = (n - 1) & n; } return count; }
完整代码:
import com.sun.org.apache.xpath.internal.operations.Number;
/**
* Class day17 ...
*
* @author LiJun
* Created on 2019/1/11
*/
public class day17 {
private static int solution(int n) {
int count = 0;
while (n != 0) {
count++;
n = (n - 1) & n;
}
return count;
}
public static int NumberOf1Solution2(int n) {
int count = 0;
int flag = 1;
while (flag >= 1) {
if ((n & flag) > 0) {
count++;
}
flag = flag << 1;
}
return count;
}
public static void main(String[] args) {
System.out.println(solution(-1));
}
}