congratulations

二进制中1的个数

题目链接

牛客网

题目描述

输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。

数据范围:- 2^{31} <= n <= 2^{31}-1−231<=n<=231−1

即范围为: -2147483648<= n <= 2147483647−2147483648<=n<=2147483647

实例1

输入:

10

返回值:

2

说明:

十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1。

实例2

输入:

-1

返回值:

32

说明:

负数使用补码表示 ,-1的32位二进制表示为1111 1111 1111 1111 1111 1111 1111 1111,其中32个1

题目分析

第一种解法:使用包装类型的方法

public static int numberOf1(int n) {
        //转为二进制字符串
        String s = Integer.toBinaryString(n);
        int sum = 0;
        for (int i = 0; i < s.length(); i++) {
            //比较
            if(s.charAt(i) == '1') {
                sum++;
            }
        }
        return sum;
    }

第二种解法:用&符号进行比较 两个数为1则为1,否则为0 例如:十进制 10 = 二进制 1010 、 十进制 9 = 二进制 1001 用&符号就得 1000

public static int numberOf1Two(int n) {
        int sum = 0;
        while (n != 0) {
            ++sum;
            //二进制  &  两数为1才是1,否则为0
            n = n & (n - 1);
        }
        return sum;
    }

相关文章: