位运算

64 阅读1分钟

lowbit()函数可以返回x中最后一个1,这个1就

int lowbit(int x)
{
return x&-x;
}

为什么lowbit()函数可以返回x中最后一个1,我们可以利用这个性质求出x中包含了多少个1

证明:为什么lowbit()会返回x中最后一个1的位置

-x其实就是x的补码,也就是x取反+1,写作为-x=~x+1

image.png

例题

801. 二进制中1的个数 - AcWing题库

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
int lowbit(int x)
{
    return x&-x;
}
int main()
{
    int n;cin>>n;
    while(n--)
    {
        int res=0;
        int x;cin>>x;
        while(x)x-=lowbit(x),res++;  //看一下x有多少个1
        cout<<res<<" ";
    }
    
    return 0;
}

image.png

代码解释: 就拿x=7解释:此时lowbit()会返回


while(7--){7-=1,res++}

image.png

while(6--){6-=2,res++}

image.png

while(4--){4-=4,res++}

image.png

最后res=3,也就是7中包含3个1