1. 概念
位运算表示对某个数进行二进制运算。对n数左移m位相当于n*2^m即n<<m,右移相当于n*2^(-m)即n>>m,求n的二进制表示中的个位数相当于n%2即n&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 << " ";
}
}