Math 给定XOR&;两个数之和。如何找到数字?

Math 给定XOR&;两个数之和。如何找到数字?,math,bit-manipulation,bitwise-operators,bitwise-xor,Math,Bit Manipulation,Bitwise Operators,Bitwise Xor,给定两个数的XOR和。如何找到数字? 例如,x=a+b,y=a^b;如果给定x,y,如何得到a,b? 如果不能,请说明原因。这是不可靠的。一个反例足以摧毁任何理论,在你的例子中,这个例子是01100和496。这两者之和为100,异或为100: 0 = 0000 0000 4 = 0000 0100 100 = 0110 0100 96 = 0110 0000 ---- ---- ---- ---- xor

给定两个数的XOR和。如何找到数字? 例如,x=a+b,y=a^b;如果给定x,y,如何得到a,b?
如果不能,请说明原因。

这是不可靠的。一个反例足以摧毁任何理论,在你的例子中,这个例子是
01100
496
。这两者之和为
100
,异或为
100

  0 = 0000 0000            4 = 0000 0100
100 = 0110 0100           96 = 0110 0000
      ---- ----                ---- ----
xor   0110 0100 = 100    xor   0110 0100 = 100
因此,给定一个
100
和一个
100
的异或,您无法知道是哪种可能性导致了这种情况

不管它值多少钱,这个程序只检查数字
0..255

#include <stdio.h>

static void output (unsigned int a, unsigned int b) {
    printf ("%u:%u = %u %u\n", a+b, a^b, a, b);
}

int main (void) {
    unsigned int limit = 256;
    unsigned int a, b;
    output (0, 0);
    for (b = 1; b != limit; b++)
        output (0, b);
    for (a = 1; a != limit; a++)
        for (b = 1; b != limit; b++)
            output (a, b);
    return 0;
}
其中:

255 255:255
128 383:127
128 319:191
128 287:223
128 271:239
128 263:247
:
and so on.
即使在这个简化的集合中,也有相当多的组合生成相同的和和和异或,最糟糕的是大量的可能性生成
255/255
的和/异或,它们是:

255:255 = 0 255
255:255 = 1 254
255:255 = 2 253
255:255 = <n> <255-n>, for n = 3 thru 255 inclusive
255:255=0 255
255:255 = 1 254
255:255 = 2 253
255:255=,对于n=3到255(含)

已经证明这是不可能的,但这里还有两个原因

对于a和b的(相当大的)子集
(a&b)==0
,您有
a+b==(a^b)
(因为不能有进位)(反向含义不成立)。在这种情况下,对于总和中的每一位,您可以选择
a
b
中的哪一位贡献了该位。显然,这个子集并没有覆盖整个输入,但它至少证明了它不能在一般情况下完成


此外,存在许多对
(x,y)
,因此没有解决
a+b==x&&(a^b)==y
,例如(不止这些)所有对
(x,y)
,其中
((x^y)&1)==1
(即一个是奇数,另一个是偶数),因为xor和和的最低位是相等的(最低位没有进位)。通过一个简单的计数参数,这必须意味着至少一些对
(x,y)
必须有多个解决方案:显然所有
(a,b)
对都有一些
(x,y)
对与其关联,因此如果不是所有
(x,y)
对都可以使用,那么其他一些对
(x,y)
必须共享。

如果你有a,b的和=a+b=(a^b)+(a&b)*2这个方程可能对你有用

这里是获得所有这些对的解决方案

逻辑: 让数字是a和b,我们知道

s = a + b
x = a ^ b
所以

x = (s-b) ^ b
因为我们知道x和s,所以对于从0到s的所有整数,只要检查最后一个等式是否满足

这是代码

public List<Pair<Integer>> pairs(int s, int x) {
    List<Pair<Integer>> pairs = new ArrayList<Pair<Integer>>();
    for (int i = 0; i <= s; i++) {
        int calc = (s - i) ^ i;
        if (calc == x) {
            pairs.add(new Pair<Integer>(i, s - i));
        }
    }
    return pairs;
}

如果你真的剪切并粘贴了作业,语法会更好。你不能。反例:x=9,y=5:3+6==9,3^6==5.2+7==9,2^7==5。还有,为什么要按位和标记这个呢?
public List<Pair<Integer>> pairs(int s, int x) {
    List<Pair<Integer>> pairs = new ArrayList<Pair<Integer>>();
    for (int i = 0; i <= s; i++) {
        int calc = (s - i) ^ i;
        if (calc == x) {
            pairs.add(new Pair<Integer>(i, s - i));
        }
    }
    return pairs;
}
class Pair<T> {
    T a;
    T b;

    public String toString() {
        return a.toString() + "," + b.toString();
    }

    public Pair(T a, T b) {
        this.a = a;
        this.b = b;
    }
}
public static void main(String[] args) {
    List<Pair<Integer>> pairs = new Test().pairs(100,100);
    for (Pair<Integer> p : pairs) {
        System.out.println(p);
    }
}
0,100
4,96
32,68
36,64
64,36
68,32
96,4
100,0