按位异或两个数字会导致数字的总和或差异

时间:2014-01-15 19:07:15

标签: algorithm bit-manipulation xor

当我对任何两个数字进行异或时,我得到它们的差值或总和的绝对值。 我在Google上搜索了很多,试图找出相关的公式。但是没有明显的公式或陈述。

示例:

10 XOR 2 = 1010 XOR 10 = 1000(8)
 1 XOR 2 =   01 XOR 10 =   11(3)

所有数字都适用吗?

3 个答案:

答案 0 :(得分:2)

不,它并非总是如此。

6 = 110
3 =  11
   ----
XOR 101 = 5

SUM   9
DIFF  3

这绝不是一个完整的分析,但这就是我所看到的:

对于您的第一个示例,1010的最低有效位与10的位相同,这将导致您在XORing时获得差异。

对于你的第二个例子,所有相应的位都不同,这将导致你在XORing时获得总和。

为什么这些属性应该很容易看到。

答案 1 :(得分:0)

如Dukelings的回答和CmdrMoozy的评论所示,并非总是如此。如你的帖子所示,至少有时是真的。所以这里有一个稍微详细的分析。

+ - 侧

显然,如果(但不仅如此)(x & y) == 0然后(x ^ y) == x + y,因为
x + y = (x ^ y) + ((x & y) << 1)

这说明了3个 32 个案(对于每个位位置,有3个选项导致AND之后的0)(x ^ y) == (x + y)

然后有(x & y) != 0的情况。这些案件正是这样的案例 (x & y) == 0x80000000,因为最高位的执行是唯一不影响任何事情的进位。

增加了3个 31 个案(31个位置有3个选择,最高位只有1个选择)。

- - 侧

对于减法,存在鲜为人知的身份x - y == (x ^ y) - ((~x & y) << 1)

这与添加真的没什么不同,而且分析几乎相同。这一次,如果(但不仅仅是)(~x & y) == 0那么(x ^ y) == x - y~不会改变案例数:仍然是3 32 。其中大多数情况与以前不同,但并非全部(考虑y = 0,然后x可以是任何事情)。

还有3个 31 额外的案件,这次来自(~x & y) == 0x80000000

双方

+-方并不是不相交的。有时,x ^ y = x + y = x - y。只有在y = 0y = 0x80000000时才会发生这种情况。如果y = 0x可以是任何内容,因为(x & 0) == 0(~x & 0) == 0适用于所有x。如果y = 0x80000000x可以再次成为任何内容,这次因为x & 0x80000000~x & 0x80000000可以同时为0或0x80000000,两者都很好

这给出了{sup> 33 个案x ^ y = x + y = x - y

它还给出了(3 32 + 3 31 )* 2 - 2 33 的情况x ^ y为{{1 }或x + y或两者,分别为4941378580336984或基数为16,118e285afb5158,这也是this site给出的答案。

这种情况很多,但只有大约0.02679%占2 64 的总空间。

答案 2 :(得分:0)

实际上,您的观察结果有一个有趣的答案,可以解释为什么您要观察这么多的数字。
a + ba ^ b之间存在关系。它是由

给出的
a + b = a^b + 2*(a & b)

因此,

a^b = a + b - 2*(a & b)

(其中^bitwise XOR,而&是按位AND
请参阅此link,以了解有关上述关系的更多信息。因此,对于每个a和b,在a & b = 0处将得到a+b = a^b,它解释了总和部分。并且如果a & b不等于0,则说明了差异部分。希望它能澄清您的问题! :D

相关问题