每日一题 - day17 - 17. 二进制中的1的个数 - Java实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jun8148/article/details/86597242

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));
    }
}

猜你喜欢

转载自blog.csdn.net/jun8148/article/details/86597242