【位运算】【打卡94天】《剑指Offer》2刷:JZ15 二进制中1的个数

1、题目描述

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

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

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

2、算法分析

第一种方法:

 知识补充:

①将字符串转换为字符数组char[] ch = str.toCharArray();

②将十进制转换为二进制: String str = Integer.toBinaryString(n);

以上知识补充也就是算法重要的两步骤,在 String str = Integer.toBinaryString(n);方法中已经包含了负数补码等。所以接下来只要遍历字符数组元素中含有1的个数就可以。

第二种方法:

知识补充:

n&(n-1)作用:将整数n的二进制为最低位为1的改为0。也就是对1进行计数。

举例:

n = 10100(二进制),n-1 = 10011,则n&(n-1) = 10000

可以看到将n = 10100最低位的1变为0,即10000

3、代码实现

方法一:

public class Solution {
    public int NumberOf1(int n) {
        // 将整数转换为字符串
        String str = Integer.toBinaryString(n);
        // 将字符串转换为字符数组
        char[] ch = str.toCharArray();
        int count = 0;
        // 计算字符数组中含有1的个数
        for(int i = 0;i < ch.length;i++){
            if(ch[i] == '1'){
                count++;
            }
        }
        return count;
    }
}

方法二:

public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        while(n != 0){
            count++;
            n &= n-1;
        }
        return count;
    }
}

Guess you like

Origin blog.csdn.net/Sunshineoe/article/details/121445110