Open In App

Count unset bits of a number

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

Given a number n, count unset bits after MSB (Most Significant Bit).
Examples : 
 

Input : 17
Output : 3
Binary of 17 is 10001
so unset bit is 3

Input : 7
Output : 0

 

A Simple Solution is to traverse through all bits and count unset bits. 
 

C++




// C++ program to count unset bits in an integer
#include <iostream>
using namespace std;
 
int countunsetbits(int n)
{
    int count = 0;
     
    // x holds one set digit at a time
    // starting from LSB to MSB of n.
    for (int x = 1; x <= n; x = x<<1)
        if ((x & n) == 0)
            count++;    
 
    return count;
}
 
// Driver code
int main()
{
    int n = 17;
    cout << countunsetbits(n);
    return 0;
}


Java




// JAVA Code to Count unset bits in a number
class GFG {
 
    public static int countunsetbits(int n)
    {
        int count = 0;
          
        // x holds one set digit at a time
        // starting from LSB to MSB of n.
        for (int x = 1; x <= n; x = x<<1)
            if ((x & n) == 0)
                count++;    
      
        return count;
    }
     
    /* Driver program to test above function */
    public static void main(String[] args)
    {
        int n = 17;
        System.out.println(countunsetbits(n));
    }
}
// This code is contributed by Arnav Kr. Mandal.


Python3




# Python 3 program to count unset
# bits in an integer
 
def countunsetbits(n):
    count = 0
     
    # x holds one set digit at a time
    # starting from LSB to MSB of n.
    x = 1
    while(x < n + 1):
        if ((x & n) == 0):
            count += 1
        x = x << 1
 
    return count
 
# Driver code
if __name__ == '__main__':
    n = 17
    print(countunsetbits(n))
     
# This code is contributed by
# Shashank_Sharma


C#




// C# Code to Count unset
// bits in a number
using System;
 
class GFG {
 
    // Function to count unset bits
    public static int countunsetbits(int n)
    {
        int count = 0;
         
        // x holds one set digit at a time
        // starting from LSB to MSB of n.
        for (int x = 1; x <= n; x = x << 1)
            if ((x & n) == 0)
                count++;    
     
        return count;
    }
     
    // Driver Code
    public static void Main()
    {
        int n = 17;
        Console.Write(countunsetbits(n));
    }
}
 
// This code is contributed by Nitin Mittal.


PHP




<?php
// PHp program to count
// unset bits in an integer
function countunsetbits($n)
{
    $count = 0;
     
    // x holds one set digit
    // at a time starting
    // from LSB to MSB of n.
    for ($x = 1; $x <= $n;
         $x = $x << 1)
        if (($x & $n) == 0)
            $count++;    
 
    return $count;
}
 
// Driver code
$n = 17;
echo countunsetbits($n);
 
// This code is contributed
// by nitin mittal.
?>


Javascript




<script>
 
// Javascript program to count unset bits in an integer
 
function countunsetbits(n)
{
    var count = 0;
     
    // x holds one set digit at a time
    // starting from LSB to MSB of n.
    for (var x = 1; x <= n; x = x<<1)
        if ((x & n) == 0)
            count++;    
 
    return count;
}
 
// Driver code
var n = 17;
document.write(countunsetbits(n));
 
</script>


Output : 

3

Above solution complexity is log(n).

Space Complexity : O(1)
Efficient Solutions : 
The idea is to toggle bits in O(1) time. Then apply any of the methods discussed in count set bits article.
In GCC, we can directly count set bits using __builtin_popcount(). First toggle the bits and then apply above function __builtin_popcount().
 

C++




// An optimized C++ program to count unset bits
// in an integer.
#include <iostream>
using namespace std;
 
int countUnsetBits(int n)
{
    int x = n;
  
    // Make all bits set MSB 
    // (including MSB)
   
    // This makes sure two bits
    // (From MSB and including MSB)
    // are set
    n |= n >> 1;
 
    // This makes sure 4 bits
    // (From MSB and including MSB)
    // are set
    n |= n >> 2;
 
    n |= n >> 4;
    n |= n >> 8;
    n |= n >> 16;
 
    // Count set bits in toggled number
    return  __builtin_popcount(x ^ n);
}
 
// Driver code
int main()
{
    int n = 17;
    cout << countUnsetBits(n);
    return 0;
}


Java




// An optimized Java program to count unset bits
// in an integer.
class GFG
{
 
static int countUnsetBits(int n)
{
    int x = n;
 
    // Make all bits set MSB
    // (including MSB)
     
    // This makes sure two bits
    // (From MSB and including MSB)
    // are set
    n |= n >> 1;
 
    // This makes sure 4 bits
    // (From MSB and including MSB)
    // are set
    n |= n >> 2;
 
    n |= n >> 4;
    n |= n >> 8;
    n |= n >> 16;
 
    // Count set bits in toggled number
    return Integer.bitCount(x^ n);
}
 
// Driver code
public static void main(String[] args)
{
    int n = 17;
    System.out.println(countUnsetBits(n));
}
}
 
/* This code contributed by PrinciRaj1992 */


Python3




# An optimized Python program to count
# unset bits in an integer.
import math
 
def countUnsetBits(n):
    x = n
 
    # Make all bits set MSB(including MSB)
 
    # This makes sure two bits(From MSB
    # and including MSB) are set
    n |= n >> 1
 
    # This makes sure 4 bits(From MSB and
    # including MSB) are set
    n |= n >> 2
 
    n |= n >> 4
    n |= n >> 8
    n |= n >> 16
 
    t = math.log(x ^ n, 2)
 
    # Count set bits in toggled number
    return math.floor(t)
 
# Driver code
n = 17
print(countUnsetBits(n))
 
# This code is contributed 29AjayKumar


C#





PHP





Javascript





Output : 
 

3

Time Complexity: O(1)

Auxiliary Space:  O(1)

 



Last Updated : 21 Jun, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads