Open In App
Related Articles

Find two numbers from their sum and XOR

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Report issue
Report

Given the sum and xor of two numbers X and Y s.t. sum and xor \in [0, 2^{64}-1]     , 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 <iostream>
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
// minimized
void 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 function
int 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
# minimized
def 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 function
S = 17
X = 13
compute(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

                    

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
// minimized
function 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 function
var 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)



Last Updated : 31 Jan, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads