Choose X such that (A xor X) + (B xor X) is minimized
Last Updated :
07 Jan, 2024
Given two integers A and B. The task is to choose an integer X such that (A xor X) + (B xor X) is the minimum possible.
Examples:
Input: A = 2, B = 3
Output: X = 2, Sum = 1
Input: A = 7, B = 8
Output: X = 0, Sum = 15
A simple solution is to generate all possible sum by taking xor of A and B with all possible values of X ? min(A, B). To generate all possible sums it would take O(N) time where N = min(A, B).
An efficient solution is based on the fact that the number X will contain the set bits only at that index where both A and B contain a set bit such that after xor operation with X that bit will be unset. This would take only O(Log N) time.
Other cases: If at a particular index one or both the numbers contain 0 (unset bit) and the number X contains 1 (set bit) then 0 will be set after xor with X in A and B then the sum couldn’t be minimized.
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
int findX( int A, int B)
{
int j = 0, x = 0;
while (A || B) {
if ((A & 1) && (B & 1)) {
x += (1 << j);
}
A >>= 1;
B >>= 1;
j += 1;
}
return x;
}
int main()
{
int A = 2, B = 3;
int X = findX(A, B);
cout << "X = " << X << ", Sum = " << (A ^ X) + (B ^ X);
return 0;
}
|
Java
class GFG {
static int findX( int A, int B)
{
int j = 0 , x = 0 ;
while (A != 0 || B != 0 ) {
if ((A % 2 == 1 ) && (B % 2 == 1 )) {
x += ( 1 << j);
}
A >>= 1 ;
B >>= 1 ;
j += 1 ;
}
return x;
}
public static void main(String[] args)
{
int A = 2 , B = 3 ;
int X = findX(A, B);
System.out.println(
"X = " + X + ", Sum = " + ((A ^ X) + (B ^ X)));
}
}
|
Python3
def findX(A, B):
j = 0
x = 0
while (A or B):
if ((A & 1 ) and (B & 1 )):
x + = ( 1 << j)
A >> = 1
B >> = 1
j + = 1
return x
if __name__ = = '__main__' :
A = 2
B = 3
X = findX(A, B)
print ( "X =" , X, ", Sum =" , (A ^ X) + (B ^ X))
|
C#
using System;
class GFG {
static int findX( int A, int B)
{
int j = 0, x = 0;
while (A != 0 || B != 0) {
if ((A % 2 == 1) && (B % 2 == 1)) {
x += (1 << j);
}
A >>= 1;
B >>= 1;
j += 1;
}
return x;
}
public static void Main(String[] args)
{
int A = 2, B = 3;
int X = findX(A, B);
Console.WriteLine(
"X = " + X + ", Sum = " + ((A ^ X) + (B ^ X)));
}
}
|
Javascript
<script>
function findX(A, B)
{
let j = 0, x = 0;
while (A != 0 || B != 0) {
if ((A % 2 == 1) && (B % 2 == 1)) {
x += (1 << j);
}
A >>= 1;
B >>= 1;
j += 1;
}
return x;
}
let A = 2, B = 3;
let X = findX(A, B);
document.write( "X = " + X + ", Sum = " + ((A ^ X) + (B ^ X)));
</script>
|
PHP
<?php
function findX( $A , $B )
{
$j = 0;
$x = 0;
while ( $A || $B ) {
if (( $A & 1) && ( $B & 1))
{
$x += (1 << $j );
}
$A >>= 1;
$B >>= 1;
$j += 1;
}
return $x ;
}
$A = 2;
$B = 3;
$X = findX( $A , $B );
echo "X = " , $X , ", Sum = " ,
( $A ^ $X ) + ( $B ^ $X );
?>
|
Time Complexity: O(log(max(A, B)))
Auxiliary Space: O(1)
Most Efficient Approach:
Using the idea that X will contain only the set bits as A and B, X = A & B. On replacing X, the above equation becomes (A ^ (A & B)) + (B ^ (A & B)) which further equates to A^B.
Proof:
Given (A ^ X) + (B ^ X)
Taking X = (A & B), we have
(A ^ (A & B)) + (B ^ (A & B))
(using x ^ y = x'y + y'x )
= (A'(A & B) + A(A & B)') + (B'(A & B) + B(A & B)')
(using (x & y)' = x' + y')
= (A'(A & B) + A(A' + B')) + (B'(A & B) + B(A' + B'))
(A'(A & B) = A'A & A'B = 0, B'(A & B)
= B'A & B'B = 0)
= (A(A' + B')) + (B(A' + B'))
= (AA' + AB') + (BA' + BB')
(using xx' = x'x = 0)
= (AB') + (BA')
= (A ^ B)
Click here to know more about Boolean Properties.
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
int findX( int A, int B) {
return A & B;
}
int findSum( int A, int B) {
return A ^ B;
}
int main()
{
int A = 2, B = 3;
cout << "X = " << findX(A, B)
<< ", Sum = " << findSum(A, B);
return 0;
}
|
Java
import java.io.*;
class GFG
{
public static int findX( int A, int B)
{
return A & B;
}
public static int findSum( int A, int B)
{
return A ^ B;
}
public static void main(String[] args)
{
int A = 2 , B = 3 ;
System.out.print( "X = " + findX(A, B)
+ ", Sum = " + findSum(A, B));
}
}
|
Python3
def findX(A, B):
return A & B
def findSum(A, B):
return A ^ B
A, B = 2 , 3
print ( "X =" , findX(A, B) , ", Sum =" , findSum(A, B))
|
C#
using System;
class GFG{
public static int findX( int A, int B)
{
return A & B;
}
public static int findSum( int A, int B)
{
return A ^ B;
}
public static void Main(String[] args)
{
int A = 2, B = 3;
Console.Write( "X = " + findX(A, B) +
", Sum = " + findSum(A, B));
}
}
|
Javascript
<script>
function findX(A, B) {
return A & B;
}
function findSum(A, B) {
return A ^ B;
}
let A = 2, B = 3;
document.write( "X = " + findX(A, B) + ", Sum = " + findSum(A, B));
</script>
|
Time Complexity: O(1)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...