算法:约束范围内数字的XOR

时间:2016-08-31 11:22:00

标签: algorithm xor

让我们说我们得到一个数字n。 我们需要找到位于[L,R]范围内的值的数量S ^(S + n)。 (其中S是任何非负整数,^是按位xor运算符)。

如果n是2的幂(他们有一个非常有用的模式),我可以很容易地做到这一点

我不知道如何解决这个问题。 有什么建议吗?

修改

n也是非负整数。 n,L,R均小于10 ^ 18。

这是我在某些实践测试中的一个编程问题,我回想一下,我记得今天在StackOverflow中看到了类似的问题。

编辑2 : 用一个例子来解释, 说n = 1。 然后我们知道S ^(S + 1)将始终具有所有1的二进制表示。例如:1,3,7,......

所以解决这个问题很简单,我们只需要在Range [L,R]中计算这些数字的数量就很简单了。

对于n = 2种类似方法的任何功率都有效。但是如果n不是2的幂,我不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

C(n)成为某些S ^ (S + n)可以写为S的(无限)数字集。

我们在集合C(n)上有以下重复关系:

  • 如果n = 2k是偶数,那么C(n) = {2x : x in C(k)};
  • 如果n = 2k + 1为奇数,则为C(n) = {2x + 1 : x in C(k)} union {2x + 1 : x in C(k + 1)}

可以从这些关系推导出算法。更准确地说,可以从(C(n), C(n + 1))推导出一对(C(n / 2), C(n / 2 + 1))。请注意,上面的union实际上是一个不相交的联合,因为C(n)中的每个元素都与n具有相同的奇偶校验,因此C(k)C(k + 1)不相交

复发关系证明:

只需查看nS的最后二进制数字。