ACM道路之一:基础算法(位运算)

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

lowbit(100010)   = 10

lowbit(11011000) = 1000

lowbit(x) = x&(-x)   = x & (~x+1)  : -x  x的补码 = x 取反+1

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

输入格式

第一行包含整数n。

第二行包含n个整数,表示整个数列。

输出格式

共一行,包含n个整数,其中的第 i 个数表示数列中的第 i 个数的二进制表示中1的个数。

数据范围

1n1000001≤n≤100000,
01090≤数列中元素的值≤109

输入样例:

5
1 2 3 4 5

输出样例:

1 1 2 1 2

代码:
#include<bits/stdc++.h>
using namespace std;
int lowbit(int x)
{
    return x&-x;
}
int main()
{
    int n;
    int k;
    cin>>n;
    while(n--)
    {
        cin>>k;
        int res=0;
        while(k) 
        {
            k-=lowbit(k);
            res++;
        }
        cout<<res<<" ";
    }
}

n>>k   n右移k位 

n>>1  n右移1位 == n/2

扫描二维码关注公众号,回复: 8930460 查看本文章

int n=10;

undesigned int k =  -n;

显示二进制数

    for(int i=31;i>=0;i--)
    {
        cout<<(k>>i&1);
    }

k:11111111111111111111111111110110

n:00000000000000000000000000001010

k+1:11111111111111111111111111110111

(k+1)&n:0000000000000000000000000000010<<<<<<<---------------------->>>>>>10

   

猜你喜欢

转载自www.cnblogs.com/YNorcoding/p/12241450.html