Leetcode—191.位1的个数【简单】

2023每日刷题(二十七)

Leetcode—191.位1的个数

在这里插入图片描述

实现代码

int hammingWeight(uint32_t n) {
    int ans = 0;
    for(int i = 0; i < 32; i++) {
        if(n & ((long long)1 << i)) {
            ans++;
        }
    }
    return ans;
}

运行结果

在这里插入图片描述

翻转比特1思路

就解法一的代码实现来说,针对任意的整数,都要执行32次的移位和与操作,如果整数比较小,比如7(用二进制表示为0x1011),不仅最低的4位需要进行移位和按位与操作,其他位也要继续进行同样的位操作,但这些操作是冗余的,是可以优化的。

优化上面的算法,使其更简单,速度更快。不去检测整数的每一位,而是依次将最低位且值为1的比特位翻转为0,并增加计数器。当执行结果使整数为0时,该整数不再包含任何为1的比特,返回计数器的值。

此时的关键问题是如何执行“翻转最低有效比特为1的比特为0”,此处可以使用n &(n-1)的操作。

在这里插入图片描述
如上图所示,在整数n的二进制码中,最低有效比特为1的位置,在对应的n-1中,该位置总是0,因此执行与操作时会将该比特的1翻转为0,并且不会改变其他比特的值。

减少重复操作实现代码

int hammingWeight(uint32_t n) {
    int ans = 0;
    while(n) {
        ans++;
        n &= (n - 1);
    }
    return ans;
}

运行结果

在这里插入图片描述

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值