如何找到xor == n的一对数字

问题描述

我是位操作的新手,我遇到了这个问题,无法弄清楚如何解决
问题 查找xor等于值n的对,并返回最小差分对

example n=5 possible pairs are 1-4,9-12 and so on
result is 4-1 as the diffrence of 4-1 is minimum 

暴力在这里不适用,因为范围非常大,直到1 有什么提示吗?

解决方法

假设n是肯定的。首先使用O(log n)循环将n减小为m的最高幂nm = n while m & (m-1): m = m & (m-1) 小2:

m

然后您的答案将是n-mm ^ (n-m) == n

让我尝试给出一个证明草图:

要弄清为什么m ^ x == n成立,这应该是微不足道的。现在,我证明为什么这对差别最小。让m代表xm > x,并且不失一般性地假设m == x。我们不假设n==0,因为否则m ^ x == n。在保持m-x的同时,如果我们将它们的相同零位翻转为1,我们将它们增加相同的数量,因此它们的差异m仍将相同。因此,我们还可以假设xm上的位在同一位置永远都不会为1。如果我们翻转x上为0但x上为1的位,则它将在m上减小而在m-x上增大,并且差值m为更大。如果我们翻转x上为1但m上为0的位,则差异可能较小。因此,差异最小的一对无法进行最后一次翻转,即m翻转m < x上的任何1位将构成{{1}}。