Count unset bits in a range
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:
- 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.
- Count number of set bits in the number (n & num). Refer this post. Let it be count.
- Calculate ans = (r – l + 1) – count.
- Return ans.
C++
// C++ implementation to count unset bits in the // given range #include <bits/stdc++.h> 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
<?php // php implementation to count // unset bits in the given range // Function to get no of set bits in // the binary representation of 'n' function countSetBits( $n ) { $count = 0; while ( $n ) { $n &= ( $n - 1); $count ++; } return $count ; } // function to count unset // bits in the given range function 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 $n = 80; $l = 1; $r = 4; echo countUnsetBitsInGivenRange( $n , $l , $r ); // This code is contributed by mits ?> |
Javascript
<script> // Javascript implementation to count unset bits in the // given range // Function to get no of set bits in the // binary representation of 'n' function countSetBits(n) { var count = 0; while (n) { n &= (n - 1); count++; } return count; } // function to count unset bits // in the given range function 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 var 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 var n = 80; var l = 1, r = 4; document.write( countUnsetBitsInGivenRange(n, l, r)); </script> |
Output:
4
Time Complexity: O(log n)
Space Complexity: O(1)
Please Login to comment...