AcWing 801. 二进制中1的个数

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=100010;
 4 int n,g[N];
 5 int lowbit(int x)
 6 {
 7     return x & -x;
 8 }
 9 int main()
10 {
11     cin>>n;
12     
13     for(int i=0;i<n;i++)
14     {
15         int x,res=0;
16         cin>>x;
17         while(x)
18         {
19             x-=lowbit(x);
20             res++;
21         }
22         cout<<res<<" ";
23     }
24 }

lowbit函数的作用:

 返回x的二进制最后一个1的位置)使用lowbit操作,进行,每次lowbit操作截取一个数字最后一个1后面的所有位,每次减去lowbit得到的数字,直到数字减到0,就得到了最终1的个数。

 

 

lowbit原理
根据计算机负数表示的特点,如一个数字原码是10001000,他的负数表示形势是补码,就是反码+1,反码是01110111,加一则是01111000,二者按位与得到了1000。例如8 第一次10-lowbit(10)=10-2=8 然后8-lobit(8)=8-8=0;

 

posted @ 2020-11-09 20:36  har74  阅读(64)  评论(0)    收藏  举报