# Find two numbers from their sum and XOR | Set 2

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 = 13Output:2 15Explanation:2 + 15 = 17 and 2 ^ 15 = 13

Input:X = 1870807699, Y = 259801747Output: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 are1(i.e., AND is 1), the resultant bit is0, and1is added as carry, which means every bit inANDisleft-shiftedby 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++

`// 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;` `}` |

## Java

`// 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` |

## Python

`# 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` `;` ` ` `# Print the 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` |

## C#

`// 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` |

## Javascript

`<script>` `// JavaScript program to implement the above approach` `// Function to find the value of A and` `// B whose sum is X and xor is Y` `function` `findNums(X, Y)` `{` ` ` `// Initialize the two numbers` ` ` `let 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) {` ` ` `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` ` ` `document.write(A + ` `" "` `+ B);` `}` `// Driver Code` ` ` `// Given Sum and XOR of 2 numbers` ` ` `let X = 17, Y = 13;` ` ` `// Function Call` ` ` `findNums(X, Y);` `</script>` |

**Output:**

2 15

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