《LeetCode191.位1的个数》 时隔一年,再次面对这篇博文,我不再胆怯

本文探讨了如何使用while循环和模二除法计算整数二进制中1的个数,针对负数的处理,通过理解补码和符号位,介绍了将负数转换为无符号整数的方法。作者回忆初次解决LeetCode 191位1个数问题的思考过程,寻找更通用的解决方案。
摘要由CSDN通过智能技术生成

论如何计算一个整数的二进制里数字1个数

  1. 用类似计算十进制数中有多少个1一样的思想,我们采用while循环和模二除二的方法,不过我们都知道,数据在内存里都是以补码的形式储存的,正数的补码和原码相同,大概可以估计这种方法对正数应该是可行的,但是对于负数呢?对于负数此时二进制的最高位为符号位,要让我们的方法一依然有效的话,就不能让编译器知道此时的二进制码表示为有符号的-1,什么意思呢?就是我们需要将最高位的符号位的效果给去除,不难想到,我们可以将此时的-1转置为unsigned_int…(后面的写法就不再说了)
  2. 那有没有一种全新的方法来解决我们一开始提出的问题呢?

—————————————分割线—————————————————— 2021 / 11 / 26

起初这篇博文是我大一第一次接触算法题,这是LeetCode上的一道题目,LeetCode191.位1的个数,第一次接触到这个题目我还显得很“稚嫩”,没有一点思路,当初写下这篇文章就是想记录我第一次在算法题上获得的成就感,由于自己懒,这篇文章也就没有写完,现在来完善它!

只是一道很简单的位运算题(现在看来hhhhhhhhh

int hammingWeight(uint32_t n) { // 由于传进来的参数是32位无符号整数,故不需要再进行转换啦
    int digits  = 0;
    
    int i = 0;
    while(i < 32)
    {
        if( (n >> i++) & 1 == 1)
        {
            digits++;
        }
    }

    return digits;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值