Math 两个正整数';a';和';b';总数为';s';以及';x';。有序对(a和#x2009;b)有多少个可能的值?

Math 两个正整数';a';和';b';总数为';s';以及';x';。有序对(a和#x2009;b)有多少个可能的值?,math,bit-manipulation,xor,Math,Bit Manipulation,Xor,我们需要找到有序对(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<In

我们需要找到有序对(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 / 2; i++) {
        int calc = (s - i) ^ i;
        if (calc == x) {
            pairs.add(new Pair<Integer>(i, s - i));
            pairs.add(new Pair<Integer>(s - i, i));
        }
    }
    return pairs;
}

注意a+b=2*(a&b)+(a^b)=2*(a | b)-(a^b),根据整数加法中求和位和进位计算的定义。竞赛问题()谢谢@njuffaa,事实上我知道这个定义。我被这个定义难住了。如果你知道进一步的解决方法,请你解释一下步骤。谢谢@abhaybhatia的可能重复,但你不认为当s为10^12时会花费很多时间。因为我们正在运行从1到s/2的整个循环。
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(9,5);
    for (Pair<Integer> p : pairs) {
        System.out.println(p);
    }
}
2,7
7,2
3,6
6,3