按位异或两个数字会得到数字的和或差

Ani*_*K K 7 algorithm bit-manipulation xor

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

例子:

10 XOR 2 = 1010 XOR 10 = 1000(8)
 1 XOR 2 =   01 XOR 10 =   11(3)
Run Code Online (Sandbox Code Playgroud)

所有数字都是如此吗?

har*_*old 6

正如 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 - yy = 0只有当 或时,才会发生这种情况y = 0x80000000。如果y = 0x可以是任何(x & 0) == 0 事情。如果,又可以是任何值,这次是因为和都可以算出 0 或 到,并且两者都可以。(~x & 0) == 0xy = 0x80000000xx & 0x80000000~x & 0x800000000x80000000

这给出了 2 33种情况,其中x ^ y = x + y = x - y.

它还给出了 (3 32 + 3 31 ) * 2 - 2 33的情况,其中x ^ yx + y或或两者,即 4941378580336984 或以 16 为基数的 118e285afb5158,这也是本网站x - y给出的答案。

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


Duk*_*ing 4

不,这并不总是正确的。

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

SUM   9
DIFF  3
Run Code Online (Sandbox Code Playgroud)

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

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

对于第二个示例,所有相应的位都不同,这会导致您在异或时得到总和。

为什么这些属性成立应该很容易看出。