当我对任何两个数字进行异或时,我得到它们的差值或总和的绝对值。 我在Google上搜索了很多,试图找出相关的公式。但是没有明显的公式或陈述。
示例:
10 XOR 2 = 1010 XOR 10 = 1000(8)
1 XOR 2 = 01 XOR 10 = 11(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 = 0
或y = 0x80000000
时才会发生这种情况。如果y = 0
,x
可以是任何内容,因为(x & 0) == 0
和(~x & 0) == 0
适用于所有x
。如果y = 0x80000000
,x
可以再次成为任何内容,这次因为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 + b
和a ^ 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