Given two positive integers A and B, the task is to flip the common set bitsin A and B.
Examples:
Input: A = 7, B = 4
Output: 3 0
Explanation:
The binary representation of 7 is 111
The binary representation of 4 is 100
Since the 3rd bit of both A and B is a set bit. Therefore, flipping the 3rd bit of A and B modifies A = 3 and B = 0
Therefore, the required output is 3 0
Input: A = 10, B = 20
Output: 10 20
Naive Approach: The simplest approach to solve this problem is to check if the ith bit of both A and B is a set or not. If found to be true, then flip the ith bit of both A and B. Finally, print the updated values of both A and B.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void flipBitsOfAandB( int A, int B)
{
for ( int i = 0; i < 32; i++) {
if ((A & (1 << i)) && (B & (1 << i))) {
A = A ^ (1 << i);
B = B ^ (1 << i);
}
}
cout << A << " " << B;
}
int main()
{
int A = 7, B = 4;
flipBitsOfAandB(A, B);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void flipBitsOfAandB( int A, int B)
{
for ( int i = 0 ; i < 32 ; i++)
{
if (((A & ( 1 << i)) &
(B & ( 1 << i))) != 0 )
{
A = A ^ ( 1 << i);
B = B ^ ( 1 << i);
}
}
System.out.print(A + " " + B);
}
public static void main(String[] args)
{
int A = 7 , B = 4 ;
flipBitsOfAandB(A, B);
}
}
|
Python3
def flipBitsOfAandB(A, B):
for i in range ( 0 , 32 ):
if ((A & ( 1 << i)) and
(B & ( 1 << i))):
A = A ^ ( 1 << i)
B = B ^ ( 1 << i)
print (A, B)
if __name__ = = "__main__" :
A = 7
B = 4
flipBitsOfAandB(A, B)
|
C#
using System;
class GFG{
static void flipBitsOfAandB( int A, int B)
{
for ( int i = 0; i < 32; i++)
{
if (((A & (1 << i)) &
(B & (1 << i))) != 0)
{
A = A ^ (1 << i);
B = B ^ (1 << i);
}
}
Console.Write(A + " " + B);
}
public static void Main( string [] args)
{
int A = 7, B = 4;
flipBitsOfAandB(A, B);
}
}
|
Javascript
<script>
function flipBitsOfAandB(A , B)
{
for (i = 0; i < 32; i++)
{
if (((A & (1 << i)) &
(B & (1 << i))) != 0)
{
A = A ^ (1 << i);
B = B ^ (1 << i);
}
}
document.write(A + " " + B);
}
var A = 7, B = 4;
flipBitsOfAandB(A, B);
</script>
|
Time Complexity: O(32)
Auxiliary Space: O(1)
Efficient Approach: To optimize the above approach, the idea is based on the following observations:
Find the bits which are set bits in both A and B using (A & B).
Clear the bits of A which are set bits in both A and B using A = (A ^ (A & B))
Clear the bits of B which are set bits in both A and B using B = (B ^ (A & B))
Follow the steps below to solve the problem:
- Update A = (A ^ (A & B)).
- Update B = (B ^ (A & B)).
- Finally, print the updated values of A and B.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void flipBitsOfAandB( int A, int B)
{
A = A ^ (A & B);
B = B ^ (A & B);
cout << A << " " << B;
}
int main()
{
int A = 10, B = 20;
flipBitsOfAandB(A, B);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void flipBitsOfAandB( int A, int B)
{
A = A ^ (A & B);
B = B ^ (A & B);
System.out.print(A + " " + B);
}
public static void main(String[] args)
{
int A = 10 , B = 20 ;
flipBitsOfAandB(A, B);
}
}
|
Python3
def flipBitsOfAandB(A, B):
A = A ^ (A & B)
B = B ^ (A & B)
print (A, B)
if __name__ = = "__main__" :
A = 10
B = 20
flipBitsOfAandB(A, B)
|
C#
using System;
class GFG{
static void flipBitsOfAandB( int A, int B)
{
A = A ^ (A & B);
B = B ^ (A & B);
Console.Write(A + " " + B);
}
public static void Main(String[] args)
{
int A = 10, B = 20;
flipBitsOfAandB(A, B);
}
}
|
Javascript
<script>
function flipBitsOfAandB(A , B)
{
A = A ^ (A & B);
B = B ^ (A & B);
document.write(A + " " + B);
}
var A = 10, B = 20;
flipBitsOfAandB(A, B);
</script>
|
Time Complexity: O(1)
Auxiliary Space: O(1)