Related Articles

# Find two numbers from their sum and XOR

• Difficulty Level : Hard
• Last Updated : 09 Nov, 2020

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


## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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.

So we generate 2^n possible pairs where n is number of bits in X. Then for every pair, we check if its sum is S or not.

An efficient solution is based on below fact.

S = X + 2*A
where A = a AND b

We can verify above fact using the sum process. In sum, whenever we see both bits 1 (i.e., AND is 1), we make resultant bit 0 and add 1 as carry, which means every bit in AND is left shifted by 1 OR value of AND is multiplied by 2 and added.

So we can find A = (S – X)/2.

Once we find A, we can find all bits of ‘a’ and ‘b’ using below rules.

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 // minimized static 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 // minimized static 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

Output
a = 15
b = 2


Time complexity of the above approach where b is number of bits in S.

My Personal Notes arrow_drop_up