求 1 xor 2 xor… xor n
按位计算:
第一位特别点
计算方法: (n&1) xor ((n>>1)&1)
每四个数异或和末尾为 0
然后就可以得出末二位值相等时才得出一
后面的位数从高到低算
- 我们可以发现
xor_sum1..2k−1=0
然后我们就根据这个特性做。
- 我们可以发现
long long n,ans;
int main(){
scanf("%lld",&n);
ans=(n&1ll)^((n>>1ll)&1ll);
fd(i,61,1)
{
long long k=1ll<<i;
if(n>=k-1)
{
ans|=k*((n-k+1)&1);//看最高位是否为1
n-=k-1;
if(n)
n--;
}
}
printf("%lld\n",ans);
rt 0;
}