Related Articles

Related Articles

Find two numbers from their sum and XOR | Set 2
  • Difficulty Level : Medium
  • Last Updated : 08 Dec, 2020

Given two integers X and Y, the task is to find the two integers having sum X and Bitwise XOR equal to Y.

Examples:

Input: X = 17, Y = 13
Output: 2 15
Explanation: 2 + 15 = 17 and 2 ^ 15 = 13

Input: X = 1870807699, Y = 259801747
Output: 805502976 1065304723

Naive Approach: Refer to the previous post of this article for the simplest approach to solve the problem. 



Time Complexity: O(log N)
Auxiliary Space: O(1)

Efficient Approach: The above approach can be optimized based on the following observations:

A + B = (A ^ B) + 2 * (A & B)
=> X = Y + 2 * (A & B)

While calculating sum, if both bits are 1(i.e., AND is 1), the resultant bit is 0, and 1 is added as carry, which means every bit in AND is left-shifted by 1, i.e. value of AND is multiplied by 2 and added.

Rearranging the terms, the expression (A&B) = (X – Y) / 2 is obtained.

This verifies the above observation. 
 

There exist the following cases:

  • If X < Y: In this case, the solution does not exist because (A & B) becomes negative which is not possible.
  • If X – Y is odd: In this case, the solution does not exist because (X – Y) is not divisible by 2.
  • If X = Y: In this case, A & B = 0. Therefore, the minimum value of A should be 0 and the value of B should be Y to satisfy the given equations.
  • Otherwise: A&B = (X – Y)/2 is satisfied, only when ((X – Y)/2) & Y equals 0. If true, the A = (X – Y)/2 and B = A + Y. Otherwise, A = -1 and B = -1.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the value of A and
// B whose sum is X and xor is Y
void findNums(int X, int Y)
{
 
    // Initialize the two numbers
    int A, B;
 
    // Case 1: X < Y
    if (X < Y) {
        A = -1;
        B = -1;
    }
 
    // Case 2: X-Y is odd
    else if (abs(X - Y) & 1) {
        A = -1;
        B = -1;
    }
 
    // Case 3: If both Sum and XOR
    // are equal
    else if (X == Y) {
        A = 0;
        B = Y;
    }
 
    // Case 4: If above cases fails
    else {
 
        // Update the value of A
        A = (X - Y) / 2;
 
        // Check if A & Y value is 0
        if ((A & Y) == 0) {
 
            // If true, update B
            B = (A + Y);
        }
 
        // Otherwise assign -1 to A,
        // -1 to B
        else {
            A = -1;
            B = -1;
        }
    }
 
    // Print the numbers A and B
    cout << A << " " << B;
}
 
// Driver Code
int main()
{
    // Given Sum and XOR of 2 numbers
    int X = 17, Y = 13;
 
    // Function Call
    findNums(X, Y);
 
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program for the above approach
import java.util.*;
    
class GFG{
    
// Function to find the value of A and
// B whose sum is X and xor is Y
static void findNums(int X, int Y)
{
     
    // Initialize the two numbers
    int A, B;
  
    // Case 1: X < Y
    if (X < Y)
    {
        A = -1;
        B = -1;
    }
  
    // Case 2: X-Y is odd
    else if (((Math.abs(X - Y)) & 1) != 0)
    {
        A = -1;
        B = -1;
    }
  
    // Case 3: If both Sum and XOR
    // are equal
    else if (X == Y)
    {
        A = 0;
        B = Y;
    }
  
    // Case 4: If above cases fails
    else
    {
         
        // Update the value of A
        A = (X - Y) / 2;
  
        // Check if A & Y value is 0
        if ((A & Y) == 0)
        {
             
            // If true, update B
            B = (A + Y);
        }
  
        // Otherwise assign -1 to A,
        // -1 to B
        else
        {
            A = -1;
            B = -1;
        }
    }
  
    // Print the numbers A and B
    System.out.print(A + " " + B);
}
    
// Driver Code
public static void main(String[] args)
{
     
    // Given Sum and XOR of 2 numbers
    int X = 17, Y = 13;
  
    // Function Call
    findNums(X, Y);
}
}
 
// This code is contributed by susmitakundugoaldanga

chevron_right


Python

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python program for the above approach
 
# Function to find the value of A and
# B whose sum is X and xor is Y
def findNums(X, Y):
   
    # Initialize the two numbers
    A = 0;
    B = 0;
 
    # Case 1: X < Y
    if (X < Y):
        A = -1;
        B = -1;
 
    # Case 2: X-Y is odd
    elif (((abs(X - Y)) & 1) != 0):
        A = -1;
        B = -1;
 
    # Case 3: If both Sum and XOR
    # are equal
    elif (X == Y):
        A = 0;
        B = Y;
 
    # Case 4: If above cases fails
    else:
 
        # Update the value of A
        A = (X - Y) // 2;
 
        # Check if A & Y value is 0
        if ((A & Y) == 0):
 
            # If True, update B
            B = (A + Y);
 
        # Otherwise assign -1 to A,
        # -1 to B
        else:
            A = -1;
            B = -1;
 
    # Prthe numbers A and B
    print A;
    print B;
 
# Driver Code
if __name__ == '__main__':
   
    # Given Sum and XOR of 2 numbers
    X = 17;
    Y = 13;
 
    # Function Call
    findNums(X, Y);
 
# This code is contributed by shikhasingrajput

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program for the above approach
using System;
 
class GFG{
    
// Function to find the value of A and
// B whose sum is X and xor is Y
static void findNums(int X, int Y)
{
     
    // Initialize the two numbers
    int A, B;
  
    // Case 1: X < Y
    if (X < Y)
    {
        A = -1;
        B = -1;
    }
  
    // Case 2: X-Y is odd
    else if (((Math.Abs(X - Y)) & 1) != 0)
    {
        A = -1;
        B = -1;
    }
  
    // Case 3: If both Sum and XOR
    // are equal
    else if (X == Y)
    {
        A = 0;
        B = Y;
    }
  
    // Case 4: If above cases fails
    else
    {
         
        // Update the value of A
        A = (X - Y) / 2;
  
        // Check if A & Y value is 0
        if ((A & Y) == 0)
        {
             
            // If true, update B
            B = (A + Y);
        }
  
        // Otherwise assign -1 to A,
        // -1 to B
        else
        {
            A = -1;
            B = -1;
        }
    }
  
    // Print the numbers A and B
    Console.Write(A + " " + B);
}
    
// Driver Code
public static void Main(String[] args)
{
     
    // Given Sum and XOR of 2 numbers
    int X = 17, Y = 13;
     
    // Function Call
    findNums(X, Y);
}
}
 
// This code is contributed by Rajput-Ji

chevron_right


Output: 

2 15

 

Time Complexity: O(1)
Auxiliary Space: O(1)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up
Recommended Articles
Page :