位运算

【考察点】位运算
&运算就要想到位运算,然后两个for循环。
需要把一个数拆分所有的二进制,
然后统计二进制位上的次数。
每次遇到的时候就直接+多少个即可。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll ;
const ll mod = 1e9+7;
const int N = 1e6+10;
const int M = 40 ;
int n ;
ll a[N] ;
ll Bit[M];


int main()
{
    scanf("%d",&n);
    for( int i = 1 ; i <= n ; i++ ){
        scanf("%lld",&a[i]);
        for( int j = 0 ; j < M ; j++ ){
            if( a[i] >> j & 1 ){
                Bit[j] ++ ;
            }
        }
    }
    ll ans = 0 ;
    for( int i = 1 ; i <= n  ;i++ ){
        for( int j = 0 ; j < M ; j++ ){
            if( a[i] >> j & 1 ){
                ans = ( ans + (Bit[j] * (1<<j)) ) ;
            }
        }    
    }
    printf("%lld\n",ans);
    return 0;
}