异或和
题目描述
给出一个正整数n,输出[1, n]的异或和,即1 xor 2 xor … xor n的结果。
输入描述
第一行一个正整数t(1\leq 10^5)t(1≤t≤10
5
),代表有t组输入。
每组输入一个正整数n(1\leq n\leq 10^{18})n(1≤n≤10
18
)
输出描述
如题。
样例
输入
3
1
2
5
输出
1
3
1
做题思路
虽然这道题可以硬算,但是会时间超限,所以我们要找规律。
规律是:
如果这个数除以4等于1,结果是1;
如果这个数除以4等于2,结果是这个数+1;
如果这个数除以4等于3,结果是0;
如果这个数除以4没有余数,结果是它本身。
我们可以按着这个规律来写代码。
代码
#include<iostream>
using namespace std;
int t;
long long n;
int main(){
cin>>t;
for(int i=1;i<=t;i++){
cin>>n;
if(n%4==1){
cout<<"1";
}
else if(n%4==2){
cout<<n+1;
}
else if(n%4==3){
cout<<"0";
}
else{
cout<<n;
}
cout<<endl;
}
return 0;
}