 Open in App
Not now

# Count unset bits in a range

• Difficulty Level : Medium
• Last Updated : 15 Jun, 2022

Given a non-negative number n and two values l and r. The problem is to count the number of unset bits in the range l to r in the binary representation of n, i.e, to count unset bits from the rightmost lth bit to the rightmost rth bit.
Examples:

```Input : n = 42, l = 2, r = 5
Output : 2
(42)10 = (101010)2
There are '2' unset bits in the range 2 to 5.

Input : n = 80, l = 1, r = 4
Output : 4```

Approach: Following are the steps:

1. Calculate num = ((1 << r) – 1) ^ ((1 << (l-1)) – 1). This will produce a number num having r number of bits and bits in the range l to r are the only set bits.
2. Count number of set bits in the number (n & num). Refer this post. Let it be count.
3. Calculate ans = (r – l + 1) – count.
4. Return ans.

## C++

 `// C++ implementation to count unset bits in the` `// given range` `#include ` `using` `namespace` `std;`   `// Function to get no of set bits in the` `// binary representation of 'n'` `unsigned ``int` `countSetBits(``int` `n)` `{` `    ``unsigned ``int` `count = 0;` `    ``while` `(n) {` `        ``n &= (n - 1);` `        ``count++;` `    ``}` `    ``return` `count;` `}`   `// function to count unset bits` `// in the given range` `unsigned ``int` `countUnsetBitsInGivenRange(unsigned ``int` `n,` `                        ``unsigned ``int` `l, unsigned ``int` `r)` `{` `    ``// calculating a number 'num' having 'r' number` `    ``// of bits and bits in the range l to r are the` `    ``// only set bits` `    ``int` `num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);`   `    ``// returns number of unset bits in the range` `    ``// 'l' to 'r' in 'n'` `    ``return` `(r - l + 1) - countSetBits(n & num);` `}`   `// Driver program to test above` `int` `main()` `{` `    ``unsigned ``int` `n = 80;` `    ``unsigned ``int` `l = 1, r = 4;` `    ``cout << countUnsetBitsInGivenRange(n, l, r);` `    ``return` `0;` `}`

## Java

 `// Java implementation to count unset bits in the` `// given range` `class` `GFG {` `    `  `    ``// Function to get no of set bits in the` `    ``// binary representation of 'n'` `    ``static` `int` `countSetBits(``int` `n)` `    ``{` `        ``int` `count = ``0``;` `        `  `        ``while` `(n > ``0``) {` `            ``n &= (n - ``1``);` `            ``count++;` `        ``}` `        `  `        ``return` `count;` `    ``}`   `    ``// function to count unset bits` `    ``// in the given range` `    ``static` `int` `countUnsetBitsInGivenRange(``int` `n,` `                                    ``int` `l, ``int` `r)` `    ``{` `        `  `        ``// calculating a number 'num' having 'r'` `        ``// number of bits and bits in the range ` `        ``// l to r are the only set bits` `        ``int` `num = ((``1` `<< r) - ``1``) ^ ((``1` `<< ` `                                   ``(l - ``1``)) - ``1``);`   `        ``// returns number of unset bits in the range` `        ``// 'l' to 'r' in 'n'` `        ``return` `(r - l + ``1``) - countSetBits(n & num);` `    ``}` `    `  `    ``// Driver code` `    ``public` `static` `void` `main(String[] args)` `    ``{` `        ``int` `n = ``80``;` `        ``int` `l = ``1``, r = ``4``;` `        `  `        ``System.out.print(` `            ``countUnsetBitsInGivenRange(n, l, r));` `    ``}` `}`   `// This code is contributed by Anant Agarwal.`

## Python3

 `# Python3 implementation to count ` `# unset bits in the given range`   `# Function to get no of set bits in ` `# the binary representation of 'n'` `def` `countSetBits (n):` `    ``count ``=` `0` `    ``while` `n:` `        ``n &``=` `(n ``-` `1``)` `        ``count ``+``=` `1` `    ``return` `count`   `# function to count unset bits` `# in the given range` `def` `countUnsetBitsInGivenRange (n, l, r):` `    `  `    ``# calculating a number 'num' having ` `    ``# 'r' number of bits and bits in the` `    ``# range l to r are the only set bits` `    ``num ``=` `((``1` `<< r) ``-` `1``) ^ ((``1` `<< (l ``-` `1``)) ``-` `1``)` `    `  `    ``# returns number of unset bits ` `    ``# in the range 'l' to 'r' in 'n'` `    ``return` `(r ``-` `l ``+` `1``) ``-` `countSetBits(n & num)`   `# Driver code to test above` `n ``=` `80` `l ``=` `1` `r ``=` `4` `print``(countUnsetBitsInGivenRange(n, l, r))`   `# This code is contributed by "Sharad_Bhardwaj"`

## C#

 `// C# implementation to count unset bits in the` `// given range` `using` `System;`   `class` `GFG {` `    `  `    ``// Function to get no of set bits in the` `    ``// binary representation of 'n'` `    ``static` `int` `countSetBits(``int` `n)` `    ``{` `        ``int` `count = 0;` `        `  `        ``while` `(n > 0) {` `            ``n &= (n - 1);` `            ``count++;` `        ``}` `        `  `        ``return` `count;` `    ``}` `     `  `    ``// function to count unset bits` `    ``// in the given range` `    ``static` `int` `countUnsetBitsInGivenRange(``int` `n,` `                                    ``int` `l,``int` `r)` `    ``{` `        `  `        ``// calculating a number 'num' having 'r' ` `        ``// number of bits and bits in the range l ` `        ``// to r are the only set bits` `        ``int` `num = ((1 << r) - 1) ^ ((1 << (l - 1)) - 1);` `     `  `        ``// returns number of unset bits in the range` `        ``// 'l' to 'r' in 'n'` `        ``return` `(r - l + 1) - countSetBits(n & num);` `    ``}` `    `  `    ``//Driver code` `    ``public` `static` `void` `Main()` `    ``{` `        ``int` `n = 80;` `        ``int` `l = 1, r = 4;` `        `  `        ``Console.Write(countUnsetBitsInGivenRange(n, l, r));` `    ``}` `}`   `//This code is contributed by Anant Agarwal.`

## PHP

 ``

## Javascript

 ``

Output:

`4`

Time Complexity: O(log n)
Space Complexity: O(1)

My Personal Notes arrow_drop_up
Related Articles