您将获得较大的范围[a,b],其中“ a”和“ b”通常可以在1到4,000,000,000之间(含)。您必须找出给定范围内所有数字的XOR。
TopCoder SRM中使用了此问题。我看到了比赛中提交的一种解决方案,但无法弄清楚其工作原理。
有人可以帮助解释获奖的解决方案:
long long f(long long a) {
long long res[] = {a,1,a+1,0};
return res[a%4];
}
long long getXor(long long a, long long b) {
return f(b)^f(a-1);
}
在这里,getXor()
实际的函数是计算通过范围[a,b]中所有数字的异或,而“ f()”是一个辅助函数。
a<=0
或的未定义行为b<0
。 long long
是带符号的类型,因此x%4
对于负输入,它是负数(或0)。也许您想要unsigned long long
和/或a & 3
为数组建立索引?