# Find two numbers from their sum and XOR

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.

- If X[i] is 1, then both a[i] and b[i] should be different, we have two cases.
- If X[i] is 0, then both a[i] and b[i] should be same. we have two cases.
- If X[i] = 0 and A[i] = 0, then a[i] = b[i] = 0. Only one possibility for this bit.
- If X[i] = 0 and A[i] = 1, then a[i] = b[i] = 1. Only one possibility for this bit.
- 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.
- If X[i] = 1 and A[i] = 1, result not possible (Note X[i] = 1 means different bits)
- Find the sum of first N odd Fibonacci numbers
- Find two numbers with sum and product both same as N
- Find k numbers which are powers of 2 and have sum N | Set 1
- Find the sum of the all amicable numbers up to N
- Find XOR of numbers from the range [L, R]
- Find original numbers from gcd() every pair
- Program to find LCM of two Fibonnaci Numbers
- Find the GCD of N Fibonacci Numbers with given Indices
- Find average of two numbers using bit operation
- Find the sum of numbers from 1 to n excluding those which are powers of K
- Find the good permutation of first N natural numbers
- Find two distinct prime numbers with given product
- Find position of left most dis-similar bit for two numbers
- Find Two Missing Numbers | Set 2 (XOR based solution)
- Find N distinct numbers whose bitwise Or is equal to K

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 bWe 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.

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

*chevron_right*

*filter_none*

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

*chevron_right*

*filter_none*

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

*chevron_right*

*filter_none*

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

*chevron_right*

*filter_none*

**Output**

a = 15 b = 2

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

## Recommended Posts:

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.