AcWing学习——位运算

53 阅读1分钟

1. 概念

位运算表示对某个数进行二进制运算。对n数左移m位相当于n*2^mn<<m,右移相当于n*2^(-m)n>>m,求n的二进制表示中的个位数相当于n%2n&1

2. 思路

通常使用位运算求n的二进制表示中第k位是几。首先将n的第k位移到个位上,即n>>k,然后求此时个位数,即n&1,此时求出来的就是n的二进制表示中第k位数字。合并操作就是n>>k&1

3. 扩展

lowbit(x):返回x的最后一位1。

例如lowbit(10),10的二进制是1010,那么返回的是10,表示的是二进制。

函数实现:x & -x = x & (~x + 1)。在计算机中,都是以补码的形式进行存储,而-x相当于求x的相反数的补码,~x相当于对x按位取反。

4.例题

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

利用lowbit(n),每次将最后一位1取出,然后减去这个1,重复执行,直到n中不存在1为止。

#include <iostream>

using namespace std;

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

int main()
{
    int n;
    scanf("%d", &n);
    
    while(n--)
    {
        int x;
        scanf("%d", &x);
        
        int res = 0;
        
        while(x)
        {
            // 每次减去x的最后一位1
            // 每减去一次表示有一位1
            x -= lowbit(x);
            res++;
        }
        
        cout << res << " ";
    }
    
}