Given three positives integers AB, and** C**, the task is to count the minimum number of flipping of bits required in A and B, such that the Bitwise OR of A and B is equal to C or not.

Examples:

Input:_ A = 2, B = 2, C = 3_

Output:_ 1_

Explanation:

_The binary representation of A is 010, B is 010 and C is 011. _

Flip the 3rd bit of either A or B, such that A | B = C, i.e. 011 | 010 = 011.

Therefore, the total number of flips required is 1.

Input:_ A = 2, B = 6, C = 5_

Output:_ 3_

Approach: Follow the steps below to solve the problem:

  • Initialize a variable, say res, that stores the minimum number of the flipped bits required.
  • Iterate over each bit of AB, and** C** and perform the following steps:
  • If the **ith **bit of C is not set, then check for the following:
  • If the ith bit of A is set, increment **res **with 1, **ith **bit of **A **needs to be flipped.
  • If the ith bit of B is set, increment **res **with 1, **ith **bit of **B **needs to be flipped.
  • If the **ith **bit of C is set, then check for the following:
  • If the ith bit of both A and B are not set, increment **res **with 1, either of the bit needs to be flipped.
  • If the ith bit of both A and B are set, we do not have to flip any of the bits.
  • After completing the above steps, print the value of** res** as the result.

Below is the implementation of the above approach:

  • C++
  • Java
  • Python3
  • C#
  • Javascript

// C++ program for the above approach

#include <bits/stdc++.h>

using namespace std;

// Function to count the number of

// bit flips required on A and B

// such that Bitwise OR of A and B is C

int minimumFlips(int A, int B, int C)

{

// Stores the count of flipped bit

int res = 0;

// Iterate over the range [0, 32]

for (int i = 0; i < 32; i++) {

int x = 0, y = 0, z = 0;

// Check if i-th bit of A is set

if (A & (1 << i)) {

x = 1;

}

// Check if i-th bit of B is

// set or not

if (B & (1 << i)) {

y = 1;

}

// Check if i-th bit of C is

// set or not

if (C & (1 << i)) {

z = 1;

}

// If i-th bit of C is unset

if (z == 0) {

// Check if i-th bit of

// A is set or not

if (x) {

res++;

}

// Check if i-th bit of

// B is set or not

if (y) {

res++;

}

}

// Check if i-th bit of C

// is set or not

if (z == 1) {

// Check if i-th bit of

// both A and B is set

if (x == 0 && y == 0) {

res++;

}

}

}

// Return the count

// of bits flipped

return res;

}

// Driver Code

int main()

{

int A = 2, B = 6, C = 5;

cout << minimumFlips(A, B, C);

return 0;

}

#bit magic #greedy #mathematical #c

Minimum number of bits required to be flipped such that Bitwise OR of A andB is equal to C
1.55 GEEK