Given three positive integers X, Y and Z, the task is to count the minimum numbers of bits required to be flipped in X and Y such that X OR Y (X | Y) is equal to Z.
Examples:
Input : X = 5 Y = 8 Z = 6 Output : 3 Explanation : Before After Flipping Flipping X :: 0101 0100 Y :: 1000 0010 ------ ----- Z :: 0110 0110 So we need to flip 3 bits in order to make (X | Y) = Z . Input : X = 1 Y = 2 Z = 3 Output : 0
Approach :
In order to solve this problem, we need to observe that the need to flip a bit X or Y arises only for the following conditions:
- If the current bit in Z is set and the corresponding bit in both X and Y is not set, we need to set a bit in either X or in Y.
- If the current bit in Z is unset, we need to unset the corresponding bit in A and B, whichever is set. Unset both if both are set.
Thus, we need to traverse through the bits of X, Y, and Z and follow the above two steps to get the desired result.
Below is the implementation of the above approach:
C++
// C++ Program to minimize // number of bits to be flipped // in X or Y such that their // bitwise or is equal to minimize #include <bits/stdc++.h> using namespace std; // This function returns minimum // number of bits to be flipped in // X and Y to make X | Y = Z int minimumFlips( int X, int Y, int Z) { int res = 0; while (X > 0 || Y > 0 || Z > 0) { // If current bit in Z is set and is // also set in either of X or Y or both if (((X & 1) || (Y & 1)) && (Z & 1)) { X = X >> 1; Y = Y >> 1; Z = Z >> 1; continue ; } // If current bit in Z is set // and is unset in both X and Y else if (!(X & 1) && !(Y & 1) && (Z & 1)) { // Set that bit in either X or Y res++; } else if ((X & 1) || (Y & 1) == 1) { // If current bit in Z is unset // and is set in both X and Y if ((X & 1) && (Y & 1) && !(Z & 1)) { // Unset the bit in both X and Y res += 2; } // If current bit in Z is unset and // is set in either X or Y else if (((X & 1) || (Y & 1)) && !(Z & 1)) { // Unset that set bit res++; } } X = X >> 1; Y = Y >> 1; Z = Z >> 1; } return res; } // Driver Code int main() { int X = 5, Y = 8, Z = 6; cout << minimumFlips(X, Y, Z); return 0; } |
Java
// Java program to minimize // number of bits to be flipped // in X or Y such that their // bitwise or is equal to minimize import java.util.*; class GFG{ // This function returns minimum // number of bits to be flipped in // X and Y to make X | Y = Z static int minimumFlips( int X, int Y, int Z) { int res = 0 ; while (X > 0 || Y > 0 || Z > 0 ) { // If current bit in Z is set and is // also set in either of X or Y or both if (((X % 2 == 1 ) || (Y % 2 == 1 )) && (Z % 2 == 1 )) { X = X >> 1 ; Y = Y >> 1 ; Z = Z >> 1 ; continue ; } // If current bit in Z is set // and is unset in both X and Y else if (!(X % 2 == 1 ) && !(Y % 2 == 1 ) && (Z % 2 == 1 )) { // Set that bit in either X or Y res++; } else if ((X % 2 == 1 ) || (Y % 2 == 1 )) { // If current bit in Z is unset // and is set in both X and Y if ((X % 2 == 1 ) && (Y % 2 == 1 ) && !(Z % 2 == 1 )) { // Unset the bit in both X and Y res += 2 ; } // If current bit in Z is unset and // is set in either X or Y else if (((X % 2 == 1 ) || (Y % 2 == 1 )) && !(Z % 2 == 1 )) { // Unset that set bit res++; } } X = X >> 1 ; Y = Y >> 1 ; Z = Z >> 1 ; } return res; } // Driver Code public static void main(String[] args) { int X = 5 , Y = 8 , Z = 6 ; System.out.print(minimumFlips(X, Y, Z)); } } // This code is contributed by amal kumar choubey |
Python3
# Python 3 Program to minimize # number of bits to be flipped # in X or Y such that their # bitwise or is equal to minimize # This function returns minimum # number of bits to be flipped in # X and Y to make X | Y = Z def minimumFlips(X, Y, Z): res = 0 while (X > 0 or Y > 0 or Z > 0 ): # If current bit in Z is # set and is also set in # either of X or Y or both if (((X & 1 ) or (Y & 1 )) and (Z & 1 )): X = X >> 1 Y = Y >> 1 Z = Z >> 1 continue # If current bit in Z is set # and is unset in both X and Y elif ( not (X & 1 ) and not (Y & 1 ) and (Z & 1 )): # Set that bit in either # X or Y res + = 1 elif ((X & 1 ) or (Y & 1 ) = = 1 ): # If current bit in Z is unset # and is set in both X and Y if ((X & 1 ) and (Y & 1 ) and not (Z & 1 )): # Unset the bit in both # X and Y res + = 2 # If current bit in Z is # unset and is set in # either X or Y elif (((X & 1 ) or (Y & 1 )) and not (Z & 1 )): # Unset that set bit res + = 1 X = X >> 1 Y = Y >> 1 Z = Z >> 1 return res # Driver Code if __name__ = = "__main__" : X = 5 Y = 8 Z = 6 print (minimumFlips(X, Y, Z)) # This code is contributed by Chitranayal |
C#
// C# program to minimize // number of bits to be flipped // in X or Y such that their // bitwise or is equal to minimize using System; class GFG{ // This function returns minimum // number of bits to be flipped in // X and Y to make X | Y = Z static int minimumFlips( int X, int Y, int Z) { int res = 0; while (X > 0 || Y > 0 || Z > 0) { // If current bit in Z is set and is // also set in either of X or Y or both if (((X % 2 == 1) || (Y % 2 == 1)) && (Z % 2 == 1)) { X = X >> 1; Y = Y >> 1; Z = Z >> 1; continue ; } // If current bit in Z is set // and is unset in both X and Y else if (!(X % 2 == 1) && !(Y % 2 == 1) && (Z % 2 == 1)) { // Set that bit in either X or Y res++; } else if ((X % 2 == 1) || (Y % 2 == 1)) { // If current bit in Z is unset // and is set in both X and Y if ((X % 2 == 1) && (Y % 2 == 1) && !(Z % 2 == 1)) { // Unset the bit in both X and Y res += 2; } // If current bit in Z is unset and // is set in either X or Y else if (((X % 2 == 1) || (Y % 2 == 1)) && !(Z % 2 == 1)) { // Unset that set bit res++; } } X = X >> 1; Y = Y >> 1; Z = Z >> 1; } return res; } // Driver Code public static void Main() { int X = 5, Y = 8, Z = 6; Console.Write(minimumFlips(X, Y, Z)); } } // This code is contributed by Code_Mech |
Javascript
<script> // Javascript Program to minimize // number of bits to be flipped // in X or Y such that their // bitwise or is equal to minimize // This function returns minimum // number of bits to be flipped in // X and Y to make X | Y = Z function minimumFlips(X, Y, Z) { var res = 0; while (X > 0 || Y > 0 || Z > 0) { // If current bit in Z is set and is // also set in either of X or Y or both if (((X & 1) || (Y & 1)) && (Z & 1)) { X = X >> 1; Y = Y >> 1; Z = Z >> 1; continue ; } // If current bit in Z is set // and is unset in both X and Y else if ((X & 1)==0 && (Y & 1)==0 && (Z & 1)) { // Set that bit in either X or Y res++; } else if ((X & 1) || (Y & 1) == 1) { // If current bit in Z is unset // and is set in both X and Y if ((X & 1) && (Y & 1) && (Z & 1)==0) { // Unset the bit in both X and Y res += 2; } // If current bit in Z is unset and // is set in either X or Y else if (((X & 1) || (Y & 1)) && (Z & 1)==0) { // Unset that set bit res++; } } X = X >> 1; Y = Y >> 1; Z = Z >> 1; } return res; } // Driver Code var X = 5, Y = 8, Z = 6; document.write(minimumFlips(X, Y, Z)); </script> |
3
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!