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)
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)
Please Login to comment...