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)
所有数字都是如此吗?
正如 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 事情。如果,又可以是任何值,这次是因为和都可以算出 0 或 到,并且两者都可以。(~x & 0) == 0xy = 0x80000000xx & 0x80000000~x & 0x800000000x80000000
这给出了 2 33种情况,其中x ^ y = x + y = x - y.
它还给出了 (3 32 + 3 31 ) * 2 - 2 33的情况,其中x ^ y是x + y或或两者,即 4941378580336984 或以 16 为基数的 118e285afb5158,这也是本网站x - y给出的答案。
这样的情况很多,但只占 2 64总空间的大约 0.02679% 。
不,这并不总是正确的。
6 = 110
3 = 11
----
XOR 101 = 5
SUM 9
DIFF 3
Run Code Online (Sandbox Code Playgroud)
这绝不是完整的分析,但这是我所看到的:
对于第一个示例, 的最低有效位1010与 的位相同10,这会导致您在异或时得到差异。
对于第二个示例,所有相应的位都不同,这会导致您在异或时得到总和。
为什么这些属性成立应该很容易看出。