LeetCode------Number of 1 Bits

本文介绍并解析了解决无符号整型数二进制表示中1位计数问题的两种高效算法。首先通过直观的方法尝试将整数转换为二进制并计数零的个数,进而认识到题目的真正要求是将其视为无符号值处理,避免了不必要的转换步骤。接着引入了两种优化解法:一种是通过位运算直接计算,另一种则是利用位运算特性逐步消除最低位的1,直至数变为0,从而实现简洁高效的1位计数。文章还深入探讨了位运算中的关键操作原理及其应用价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目简介


Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming weight).

For example, the 32-bit integer ’11' has binary representation 00000000000000000000000000001011, so the function should return 3.


题目的意思是计算一个无符号整形数的二进制中1的个数


自己的解法


public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
             int count = 0;
             int s = 2;
             int y;
             while(s != 0){
                 s = n/2;
                 y = n%2;
                 if(y == 1)
                 count++;
                 n = s;
             }
             return count;
    }
}


刚开始我只想到了最笨的方法就是把它转换成二进制然后再数它零的个数,然而我忽略了
you need to treat n as an unsigned value
坑爹呀,这道题并不是考察我们10进制转2进制,所以题目中给的是int而不是unsigned int,题目中任然让我们把它当做unsigned int.所以我的提交没有通过卡到了2147483648这个测试用例上。


Hot解法


public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int ones = 0;
        while(n!=0) {
            ones = ones + (n & 1);
            n = n>>>1;
        }
        return ones;
    }
}


这种解法利用的是这一步操作ones = ones + (n&1),通过这一步操作可以知道,当前n的最后一位二进制补码是不是1,如果是1则加1,然后通过>>>操作右移一位继续判断。


public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int ones = 0;
        while(n!=0) {
            n = n & (n - 1);
            ones++;
        }
        return ones;
    }
}


这种解法利用的是这一步操作n = n & (n -1),可不要小看这一步操作它的用处可是非常多,先理解一下它的作用是什么?
n = 10100(二进制),则(n-1) = 10011 ==》n&(n-1) = 10000
可以看到原本最低位为1的那位变为0。
在我们的题目中只要一直进行这一步操作,进行一次加一,知道这个数为0,也就计算出了当前数字二进制中1的个数.
参考http://blog.youkuaiyun.com/zheng0518/article/details/8882394(有关n = n & (n -1)的用法大家可以去看一下)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值