题意:t组数据 给你一个长度为n的数组 每个数转化为二进制 位数相同的可以互换 没有次数限制 求的 max-min的值
思路:找到最大的数的位数 统计这个数组中 每位数是否有1 有则加上
找到最小的数的位数 统计在这个数组中 每位数是否有0 有0 则不加上
位运算
include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N=1e6+10;
int main()
{
int t;cin>>t;
while(t--)
{
int n;cin>>n;
int a[n+1];
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);
int x=a[1];
int x1=0;
while(x)
{
x/=2;
x1++;
}
//b数组统计每一位1的个数(知道最大数的位数) c统计每一位0的个数 (知道最小数的位数)
int b[32]={0},c[32]={0};
int flag=0;
int max=0;
for(int i=1;i<=n;i++)
{
if(a[i]==0) flag=1;
int num=0;
while(a[i])
{
if(a[i]%2==0)
{
c[num]++;
num++;
}
else
{
b[num]++;
num++;
}
a[i]/=2;
if(max<num) max=num;
}
}
int num1=0,num2=0;
for(int i=0;i<=max-1;i++)
{
if(b[i]) num1+=pow(2,i);
}
for(int i=0;i<=x1-1;i++)
{
if(c[i]==0) num2+=pow(2,i);
}
if(flag) cout<<num1<<endl;
else cout<<num1-num2<<endl;
}
return 0;
}