位运算
【考察点】位运算
&运算就要想到位运算,然后两个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;
}
京公网安备 11010502036488号