Maximum 0’s between two immediate 1’s in binary representation
Last Updated :
11 Sep, 2023
Given a number n, the task is to find the maximum 0’s between two immediate 1’s in binary representation of given n. Return -1 if binary representation contains less than two 1’s.
Examples :
Input : n = 47
Output: 1
// binary of n = 47 is 101111
Input : n = 549
Output: 3
// binary of n = 549 is 1000100101
Input : n = 1030
Output: 7
// binary of n = 1030 is 10000000110
Input : n = 8
Output: -1
// There is only one 1 in binary representation
// of 8.
The idea to solve this problem is to use shift operator. We just need to find the position of two immediate 1’s in binary representation of n and maximize the difference of these position.
- Return -1 if number is 0 or is a power of 2. In these cases there are less than two 1’s in binary representation.
- Initialize variable prev with position of first right most 1, it basically stores the position of previously seen 1.
- Now take another variable cur which stores the position of immediate 1 just after prev.
- Now take difference of cur – prev – 1, it will be the number of 0’s between to immediate 1’s and compare it with previous max value of 0’s and update prev i.e; prev=cur for next iteration.
- Use auxiliary variable setBit, which scans all bits of n and helps to detect if current bits is 0 or 1.
- Initially check if N is 0 or power of 2.
Below is the implementation of the above idea :
C++
#include <bits/stdc++.h>
using namespace std;
int maxZeros( int n)
{
if (n == 0 || (n & (n - 1)) == 0)
return -1;
int setBit = 1, prev = 0, i;
for (i = 1; i <= sizeof ( int ) * 8; i++) {
prev++;
if ((n & setBit) == setBit) {
setBit = setBit << 1;
break ;
}
setBit = setBit << 1;
}
int max0 = INT_MIN, cur = prev;
for ( int j = i + 1; j <= sizeof ( int ) * 8; j++) {
cur++;
if ((n & setBit) == setBit) {
if (max0 < (cur - prev - 1))
max0 = cur - prev - 1;
prev = cur;
}
setBit = setBit << 1;
}
return max0;
}
int main()
{
int n = 549;
cout << maxZeros(n);
return 0;
}
|
Java
class GFG {
static int maxZeros( int n) {
if (n == 0 || (n & (n - 1 )) == 0 ) {
return - 1 ;
}
byte b = 4 ;
int setBit = 1 , prev = 0 , i;
for (i = 1 ; i <= b* 8 ; i++) {
prev++;
if ((n & setBit) == setBit) {
setBit = setBit << 1 ;
break ;
}
setBit = setBit << 1 ;
}
int max0 = Integer.MIN_VALUE, cur = prev;
for ( int j = i + 1 ; j <= b * 8 ; j++) {
cur++;
if ((n & setBit) == setBit) {
if (max0 < (cur - prev - 1 )) {
max0 = cur - prev - 1 ;
}
prev = cur;
}
setBit = setBit << 1 ;
}
return max0;
}
static public void main(String[] args) {
int n = 549 ;
System.out.println(maxZeros(n));
}
}
|
Python3
def maxZeros(n):
if (n = = 0 or (n & (n - 1 )) = = 0 ):
return - 1
setBit = 1
prev = 0
i = 1
while (i < 33 ):
prev + = 1
if ((n & setBit) = = setBit):
setBit = setBit << 1
break
setBit = setBit << 1
max0 = - 10 * * 9
cur = prev
for j in range (i + 1 , 33 ):
cur + = 1
if ((n & setBit) = = setBit):
if (max0 < (cur - prev - 1 )):
max0 = cur - prev - 1
prev = cur
setBit = setBit << 1
return max0
n = 549
print (maxZeros(n))
|
C#
using System;
class GFG {
static int maxZeros( int n)
{
if (n == 0 || (n & (n - 1)) == 0)
return -1;
int setBit = 1, prev = 0, i;
for (i = 1; i <= sizeof ( int ) * 8; i++) {
prev++;
if ((n & setBit) == setBit) {
setBit = setBit << 1;
break ;
}
setBit = setBit << 1;
}
int max0 = int .MinValue, cur = prev;
for ( int j = i + 1; j <= sizeof ( int ) * 8; j++) {
cur++;
if ((n & setBit) == setBit) {
if (max0 < (cur - prev - 1))
max0 = cur - prev - 1;
prev = cur;
}
setBit = setBit << 1;
}
return max0;
}
static public void Main()
{
int n = 549;
Console.WriteLine(maxZeros(n));
}
}
|
Javascript
<script>
function maxZeros(n)
{
if (n == 0 || (n & (n - 1)) == 0)
{
return -1;
}
let b = 4;
let setBit = 1, prev = 0, i;
for (i = 1; i <= b* 8; i++)
{
prev++;
if ((n & setBit) == setBit)
{
setBit = setBit << 1;
break ;
}
setBit = setBit << 1;
}
let max0 = Number.MIN_VALUE, cur = prev;
for (let j = i + 1; j <= b * 8; j++)
{
cur++;
if ((n & setBit) == setBit)
{
if (max0 < (cur - prev - 1))
{
max0 = cur - prev - 1;
}
prev = cur;
}
setBit = setBit << 1;
}
return max0;
}
let n = 549;
document.write(maxZeros(n));
</script>
|
Output:
3
Time Complexity: O(1), because it is taking constant time irrespective of the input n.
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...