剑指offer 15.二进制中1的个数

二进制中1的个数

题目:请实现一个函数,输入一个整数(以二进制串形式),输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。

来源:力扣(LeetCode)

法一

看到这道题首先想到的是之前做的剑指offer第五题,替换空挡。首先我想先把数字转换为String形式,用到了valueof(),但是却显示错误,后来我发现是我没有读懂题目,题目要求的是输入一个整数,把整数转化为二进制数后计算“1”的数量,如果输入32个十进制数字就超过了范围。错误代码如下:

public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        String s=String.valueOf(n);
        int res=0;
        for(int i=0;i<s.length();i++){
        if(s.charAt(i)=='1'){
            res++;
        }
    }
    return res;
        
    }
}

所以要把十进制数字转化为二进制数字,用到了Integer类型中的toBinaryString(int i)方法,问题得到解决。代码如下:

代码

public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        String s=Integer.toBinaryString(n);
        int res=0;  
        for(int i=0;i<s.length();i++){
            if (s.charAt(i) == '1' ){
                res ++;
            }
        }
        return res;        
    }
}

法二 位运算

代码

public class Solution {
    public int hammingWeight(int n) {
        int res = 0;
        while(n != 0) {
            res += n & 1;
            n >>>= 1;
        }
        return res;
    }
}
作者:jyd

总结

利用与运算,若 n & 1 = 0,则 n 二进制最右一位为0;若 n & 1 = 1 ,则 n 二进制最右一位为1 。同时利用“>>>”进行无符号右移。

法三.n&(n−1)

思想

(n−1) :二进制数字n最右边的1变成 0,此1右边的0都变成1。
n & (n - 1)解析:二进制数字n最右边的1变成0,其余不变。

代码

public class Solution {
    public int hammingWeight(int n) {
        int res = 0;
        while(n != 0) {
            res++;
            n &= n - 1;
        }
        return res;
    }
}
作者:jyd
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值