# Find two numbers from their sum and XOR

• Difficulty Level : Hard
• Last Updated : 31 Jan, 2023

Given the sum and xor of two numbers X and Y s.t. sum and xor , we need to find the numbers minimizing the value of X. Examples :

Input : S = 17
X = 13
Output : a = 2
b = 15

Input : S = 1870807699
X = 259801747
Output : a = 805502976
b = 1065304723

Input : S = 1639
X = 1176
Output : No such numbers exist

Variables Used: X ==> XOR of two numbers S ==> Sum of two numbers X[i] ==> Value of i-th bit in X S[i] ==> Value of i-th bit in S

A simple solution is to generate all possible pairs with given XOR. To generate all pairs, we can follow below rules.

1. If X[i] is 1, then both a[i] and b[i] should be different, we have two cases.
2. If X[i] is 0, then both a[i] and b[i] should be same. we have two cases.
1. If X[i] = 0 and A[i] = 0, then a[i] = b[i] = 0. Only one possibility for this bit.
2. If X[i] = 0 and A[i] = 1, then a[i] = b[i] = 1. Only one possibility for this bit.
3. If X[i] = 1 and A[i] = 0, then (a[i] = 1 and b[i] = 0) or (a[i] = 0 and b[i] = 1), we can pick any of the two.
4. If X[i] = 1 and A[i] = 1, result not possible (Note X[i] = 1 means different bits)

Let the summation be S and XOR be X.

Below is the implementation of above approach:

## C++

 // CPP program to find two numbers with// given Sum and XOR such that value of// first number is minimum.#include using namespace std; // Function that takes in the sum and XOR// of two numbers and generates the two// numbers such that the value of X is// minimizedvoid compute(unsigned long int S,            unsigned long int X){    unsigned long int A = (S - X)/2;     int a = 0, b = 0;     // Traverse through all bits    for (int i=0; i<8*sizeof(S); i++)    {        unsigned long int Xi = (X & (1 << i));        unsigned long int Ai = (A & (1 << i));        if (Xi == 0 && Ai == 0)        {            // Let us leave bits as 0.        }        else if (Xi == 0 && Ai > 0)        {            a = ((1 << i) | a);            b = ((1 << i) | b);        }        else if (Xi > 0 && Ai == 0)        {            a = ((1 << i) | a);             // We leave i-th bit of b as 0.        }        else // (Xi == 1 && Ai == 1)        {            cout << "Not Possible";            return;        }    }     cout << "a = " << a << endl << "b = " << b;} // Driver functionint main(){    unsigned long int S = 17, X = 13;    compute(S, X);    return 0;}

## Java

 // Java program to find two numbers with// given Sum and XOR such that value of// first number is minimum.class GFG { // Function that takes in the sum and XOR// of two numbers and generates the two// numbers such that the value of X is// minimizedstatic void compute(long S, long X){    long A = (S - X)/2;    int a = 0, b = 0;        final int LONG_FIELD_SIZE     = 8;     // Traverse through all bits    for (int i=0; i<8*LONG_FIELD_SIZE; i++)    {        long Xi = (X & (1 << i));        long Ai = (A & (1 << i));        if (Xi == 0 && Ai == 0)        {            // Let us leave bits as 0.        }        else if (Xi == 0 && Ai > 0)        {            a = ((1 << i) | a);            b = ((1 << i) | b);        }        else if (Xi > 0 && Ai == 0)        {            a = ((1 << i) | a);             // We leave i-th bit of b as 0.        }        else // (Xi == 1 && Ai == 1)        {            System.out.println("Not Possible");            return;        }    }     System.out.println("a = " + a +"\nb = " + b);} // Driver function    public static void main(String[] args) {        long S = 17, X = 13;    compute(S, X);     }}// This code is contributed by RAJPUT-JI

## Python3

 # Python program to find two numbers with# given Sum and XOR such that value of# first number is minimum.  # Function that takes in the sum and XOR# of two numbers and generates the two# numbers such that the value of X is# minimizeddef compute(S, X):    A = (S - X)//2    a = 0    b = 0     # Traverse through all bits    for i in range(64):        Xi = (X & (1 << i))        Ai = (A & (1 << i))        if (Xi == 0 and Ai == 0):            # Let us leave bits as 0.            pass                     elif (Xi == 0 and Ai > 0):            a = ((1 << i) | a)            b = ((1 << i) | b)                 elif (Xi > 0 and Ai == 0):            a = ((1 << i) | a)            # We leave i-th bit of b as 0.         else: # (Xi == 1 and Ai == 1)            print("Not Possible")            return     print("a = ",a)    print("b =", b)  # Driver functionS = 17X = 13compute(S, X) # This code is contributed by ankush_953

## C#

 // C# program to find two numbers with// given Sum and XOR such that value of// first number is minimum.using System; public class GFG { // Function that takes in the sum and XOR// of two numbers and generates the two// numbers such that the value of X is// minimizedstatic void compute(long S, long X){    long A = (S - X)/2;    int a = 0, b = 0;      // Traverse through all bits    for (int i=0; i<8*sizeof(long); i++)    {        long Xi = (X & (1 << i));        long Ai = (A & (1 << i));        if (Xi == 0 && Ai == 0)        {            // Let us leave bits as 0.        }        else if (Xi == 0 && Ai > 0)        {            a = ((1 << i) | a);            b = ((1 << i) | b);        }        else if (Xi > 0 && Ai == 0)        {            a = ((1 << i) | a);             // We leave i-th bit of b as 0.        }        else // (Xi == 1 && Ai == 1)        {            Console.WriteLine("Not Possible");            return;        }    }     Console.WriteLine("a = " + a +"\nb = " + b);} // Driver function    public static void Main() {        long S = 17, X = 13;        compute(S, X);    }}// This code is contributed by RAJPUT-JI

## Javascript

 // JavaScript program to find two numbers with// given Sum and XOR such that value of// first number is minimum.  // Function that takes in the sum and XOR// of two numbers and generates the two// numbers such that the value of X is// minimizedfunction compute(S, X){    var A = Math.floor((S - X) / 2);    var a = 0;    var b = 0;     // Traverse through all bits    for (var i = 0; i < 64; i++)    {        var Xi = (X & (1 << i));        var Ai = (A & (1 << i));        if (Xi == 0 && Ai == 0)        {            // Let us leave bits as 0.            continue;        }                     else if (Xi == 0 && Ai > 0)        {            a = ((1 << i) | a);            b = ((1 << i) | b);        }                 else if (Xi > 0 && Ai == 0)        {            a = ((1 << i) | a);            // We leave i-th bit of b as 0.        }         else        {        // (Xi == 1 and Ai == 1)            console.log("Not Possible");            return;        }    }     console.log("a = " + a);    console.log("b = " + b);} // Driver functionvar S = 17;var X = 13;compute(S, X); // This code is contributed by phasing17

Output
a = 15
b = 2

Time Complexity: O(logn)

Auxiliary Space: O(1)

My Personal Notes arrow_drop_up