常见位运算的lowbit操作

lowbit的实现

lowbit(x)可以算出x二进制形式的从左往右的最后一个1与后面的数字组成的数对应的十进制形式

举例

  • 十进制12=1100,则lowbit(12)=100=8

代码实现

int lowbit(int x) 
{
  return x & -x;//x&-x相当于x&(x按位取反+1)
}

具体问题

二进制中1的个数

给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。

可以通过lowbit函数得到最后一个1和后面的0组成的数,将其从原数字中减去,每减去一次,说明有一个1出现,当原数字为0,跳出循环

方法一

#include <iostream>

using namespace std;
const int N=1e5+10;
int a[N];
int lowbit(int x)
{
    return x&-x;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    for(int i=0;i<n;i++)
    {
        int res=0;
        while(a[i])
        {
            int lb=lowbit(a[i]);
            a[i]-=lb;
            res++;
        }
        if(i==0) cout<<res;
        else cout<<' '<<res;
    }
    return 0;
}

方法二

与【剑指 Offer 15. 二进制中1的个数】类似

原题链接

思路

  • m&1表示取数字m对应二进制串的最后一位,比如m=5,则m(bin)=101,m&1=1
  • m>>1表示将数字m对应二进制串右移一位
  • 需要注意到,若m是int类型(有符号数),那么对于负数,右移位之后最高位会补1,从而造成死循环,但是若m是unsigned类型,则高位会补0,不会造成死循环
  • 当m不为0的时候循环右移即可
  • 注:uint32_t是32位unsigned int类型

代码

class Solution {
public:
    int hammingWeight(uint32_t n) {
        unsigned int m=n;
        int s=0;
        while(m)
        {
            s+=m&1;
            m>>=1;
        }
        return s;
    }
};
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值