Open In App

Minimum bitwise operations to convert given a into b.

Improve
Improve
Like Article
Like
Save
Share
Report

Given two positive integer a and b you have to change a to b by applying any of the three operations on binary form of a. You can select ai and aj (any two bits where i!=j) from binary form of a and then perform operation as: 
 

  • AND operation as : temp = ai & aj, ai = temp & ai, aj = temp & aj
  • OR operation as : temp = ai | aj, ai = temp | ai, aj = temp | aj
  • XOR operation as : temp = ai ^ aj, ai = temp ^ ai, aj = temp ^ aj

where & = bitwise AND, | = bitwise OR and ^ = bitwise XOR. 
Find the minimum operation required for conversion of a to b. Also, if conversion of a to b is not possible then print -1.
Examples: 
 

Input : a = 12 (1100), b = 10 (1010)
Output : 1
Explanation : select a2 and a3 and perform XOR 

Input : a = 15 (1111), b = 10 (1010)
Output : -1
Explanation : Conversion from a to b is not possible

Explanation : First of all let’s understand the working of all three operation. 
 

  1. AND operation as : temp = ai & aj, ai = temp & ai, aj = temp & aj                                                                                                                   If any of ai or aj is 0 then it makes both as 0 otherwise no effect on ai and aj. 
  2. OR operation as : temp = ai | aj, ai = temp | ai, aj = temp | aj                                                                                                                            If any of ai or aj is 1 then it makes both as 1 otherwise no effect on ai and aj.
  3. XOR operation as : temp = ai ^ aj, ai = temp ^ ai, aj = temp ^ aj                                                                                                              Simply interchange value of ai and aj.

Some conclusion on basis of working of operations : 
 

  1. If all bits of a are 1 or 0 then we can not change value of a.
  2. If a equals to b then no operation required.
  3. Let n be number of indices i, where ai = 0 and bi = 1. 
    Let m be number of indices i, where ai = 1 and bi = 0.
    Let us think about the n elements, where ai = 0 and bi = 1. We have to change all of these zeros into ones. Note that this will require at least n operations. 
    Similarly for all the m elements, where ai = 1 and bi = 0. We have to change all of these ones into zeros. Note that this will require at least m operations.
    Let res = max(n, m). We can make the a and b equal in res operations as follows.
    Let n >= m. Take m 1’s and n 0’s in A and apply the XOR operation to swap 0’s with 1’s. After that you will be left with total n-m zeros elements to change to one. That you can do by taking each of these zeros with some single one and applying the OR operation. 
    Let m >= n. Take m 1’s and n 0’s in A and apply the XOR operation to swap 0’s with 1’s. After that you will be left with total m-n ones elements to change to zero. That you can do by taking each of these ones with some single zero and applying the OR operation.

 

 

CPP




// Cpp program to find min operation to convert a to
 
#include <bits/stdc++.h>
 
using namespace std;
 
// function to return min operation
int minOp(bitset<32> a1, bitset<32> b1)
{
    // if a1 == b1 return 0
    if (a1 == b1)
        return 0;
    // if all bits of a = 0
    if (a1 == 0)
        return -1;
    // if all bits of a =1
    // first convert a1 to int and then call a1 & a1+1
    if (((int)a1.to_ulong() & ((int)a1.to_ulong() + 1))
        == 0)
        return -1;
    // convert a and b to binary string
    string a = a1.to_string();
    string b = b1.to_string();
    // check where ai and bi are different
    // and count n where ai = 1 and m where ai = 0
    int n = 0, m = 0;
    for (int i = 0; i < b.size(); i++) {
        if (b[i] != a[i]) {
            if (a[i] == '1')
                n++;
            else
                m++;
        }
    }
    // return result
    return max(n, m);
}
// driver program
int main()
{
    bitset<32> a = 14, b = 1;
    cout << minOp(a, b);
    return 0;
}


Java




// Java program to find min operation to convert a to
import java.util.*;
 
class GFG {
  static String leftPad(String input, int length,
                        String fill)
  {
    String pad = String.format("%" + length + "s", "")
      .replace(" ", fill)
      + input.trim();
    return pad.substring(pad.length() - length,
                         pad.length());
  }
  // Function to return min operation
  static int minOp(int a, int b)
  {
    String a1
      = leftPad((Integer.toBinaryString(a)), 32, "0");
    String b1
      = leftPad((Integer.toBinaryString(b)), 32, "0");
 
    // if a1 == b1 return 0
    if (a1 == b1)
      return 0;
    // if all bits of a = 0
    if (Integer.parseInt(a1, 2) == 0)
      return -1;
 
    // if all bits of a =1
    // first convert a1 to int and then call a1 &
    // a1+1
    if ((Integer.parseInt(a1, 2)
         & (Integer.parseInt(a1, 2) + 1))
        == 0)
      return -1;
 
    // convert a and b to binary string
 
    // check where ai and bi are different
    // and count n where ai = 1 and m where ai = 0
    int n = 0;
    int m = 0;
    for (int i = 0; i < b1.length(); i++) {
      if (b1.charAt(i) != a1.charAt(i)) {
        if (a1.charAt(i) == '1')
          n += 1;
        else
          m += 1;
      }
    }
 
    // return result
    return Math.max(n, m);
  }
 
  // Driver program
  public static void main(String[] args)
  {
    int a = 14;
    int b = 1;
    System.out.print(minOp(a, b));
  }
}
 
// This code is contributed by phasing17


Python3




#Python3 program to find min operation to convert a to
 
# function to return min operation
def minOp(a1, b1):
    a1 = bin(a1)[2::].zfill(32)
    b1 = bin(b1)[2::].zfill(32)
    # if a1 == b1 return 0
    if (a1 == b1):
        return 0
    # if all bits of a = 0
    if (int(a1) == 0):
        return -1
    # if all bits of a =1
    # first convert a1 to int and then call a1 & a1+1
    if (int(a1) & (int(a1) + 1)) == 0:
        return -1
         
    # convert a and b to binary string
 
  
    # check where ai and bi are different
    # and count n where ai = 1 and m where ai = 0
    n = 0
    m = 0
    for i in range(len(b1)):
        if b1[i] != a1[i]:
            if a1[i] == '1':
                n += 1
            else:
                m += 1
 
    # return result
    return max(n, m)
 
# Driver program
a = 14
b = 1
print(minOp(a, b))
 
 
#This code is contributed by phasing17


C#




// C# program to find min operation to convert a to
using System;
 
class GFG {
 
  // Function to return min operation
  static int minOp(int a, int b)
  {
    string a1 = Convert.ToString(a, 2).PadLeft(32, '0');
    string b1 = Convert.ToString(b, 2).PadLeft(32, '0');
 
    // if a1 == b1 return 0
    if (a1 == b1)
      return 0;
    // if all bits of a = 0
    if (Convert.ToInt32(a1) == 0)
      return -1;
 
    // if all bits of a =1
    // first convert a1 to int and then call a1 & a1+1
    if ((Convert.ToInt32(a1)
         & (Convert.ToInt32(a1) + 1))
        == 0)
      return -1;
 
    // convert a and b to binary string
 
    // check where ai and bi are different
    // and count n where ai = 1 and m where ai = 0
    var n = 0;
    var m = 0;
    for (var i = 0; i < b1.Length; i++) {
      if (b1[i] != a1[i]) {
        if (a1[i] == '1')
          n += 1;
        else
          m += 1;
      }
    }
 
    // return result
    return Math.Max(n, m);
  }
 
  // Driver program
  public static void Main(String[] args)
  {
    int a = 14;
    int b = 1;
    Console.Write(minOp(a, b));
  }
}
 
// This code is contributed by phasing17


Javascript




// JavaScript program to find min operation to convert a to
 
// function to return min operation
function minOp(a1, b1)
{
    a1 = a1.toString(2).padStart(32, '0');
    b1 = b1.toString(2).padStart(32, '0');
 
    // if a1 == b1 return 0
    if (a1 == b1)
        return 0;
    // if all bits of a = 0
    if (parseInt(a1) == 0)
        return -1;
     
    // if all bits of a =1
    // first convert a1 to int and then call a1 & a1+1
    if ((parseInt(a1) & (parseInt(a1) + 1)) == 0)
        return -1 ;
         
    // convert a and b to binary string
 
    // check where ai and bi are different
    // and count n where ai = 1 and m where ai = 0
    let n = 0;
    let m = 0;
    for (var i = 0; i < b1.length; i++)
    {
        if (b1[i] != a1[i])
        {
            if (a1[i] == '1')
                n += 1;
            else
                m += 1;
        }
    }
 
    // return result
    return Math.max(n, m);
}
 
// Driver program
let a = 14;
let b = 1;
console.log(minOp(a, b));
 
// This code is contributed by phasing17


Output: 
 

3

Time Complexity – O(K)

Space Complexity – O(K)

Here, K is a constant.

 



Last Updated : 28 Mar, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads