#include <iostream>
#include <cstring>
using namespace std;
void solve(){
int n,cnt[25],maxp=0;
memset(cnt,0,sizeof(cnt));
cin>>n;
for(int i=1;i<=n;i++){
int p=0,t;
cin>>t;
while(t){
cnt[p++]+=(t&1);
maxp=max(p,maxp);
t>>=1;
}
}
int result=0;
for(int i=maxp-1;i>=0;i--){
if(cnt[i]&1){//cnt[i] is odd
result=(n&1||cnt[i]==1)?1:-1;
break;
}//else, cnt[i] is even, check next
}
printf("%d\n",result);
}
int main()
{
int T;
ios::sync_with_stdio(false);
cin>>T;
while(T){
solve();
T--;
}
return 0;
}
这段代码是一个解决二进制异或问题的程序。给定 n 个二进制数,每个数有 m 位,求这 n 个数的异或和的奇偶性。
程序的思路是:对于每一位,统计这一位上 1 的个数,如果这个个数是奇数,那么异或和的这一位就是 1,否则就是 0。最后判断异或和的奇偶性即可。
具体实现上,我们可以用一个数组 cnt 来记录每一位上