📜  计算范围内的设置位

📅  最后修改于: 2021-05-25 08:09:41             🧑  作者: Mango

给定一个非负数n和两个值lr 。问题在于,以n的二进制表示形式对范围在lr之间的设置位数进行计数,即,对从最右边的第l位到最右边的第r位的设置位进行计数。
约束: 1 <= l <= r <= n的二进制表示形式的位数。
例子:

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

Input : n = 79, l = 1, r = 4
Output : 4

方法:以下是步骤:

  1. 计算num =(((1 << r)– 1)^((1 <<(l-1))– 1)。这将产生一个数字num,它具有r个位数,并且范围lr的位数是唯一的设置位。
  2. 计算数字中的设置位数(n和num) 。请参阅这篇文章。
C++
// C++ implementation to count set 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 set bits in the given range
unsigned int countSetBitsInGivenRange(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 set bits in the range
    // 'l' to 'r' in 'n'
    return countSetBits(n & num);
}
 
// Driver program to test above
int main()
{
    unsigned int n = 42;
    unsigned int l = 2, r = 5;
    cout << countSetBitsInGivenRange(n, l, r);
    return 0;
}


Java
// Java implementation to count set 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 set bits in the given range
    static int countSetBitsInGivenRange(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 set bits in the range
        // 'l' to 'r' in 'n'
        return countSetBits(n & num);
    }
     
    // Driver code
    public static void main(String[] args)
    {
        int n = 42;
        int l = 2, r = 5;
         
        System.out.print(countSetBitsInGivenRange(n, l, r));
    }
}
 
// This code is contributed by Anant Agarwal.


Python3
# Python3 implementation to count
# set 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 = count + 1
     
    return count
  
# function to count set bits in
# the given range
def countSetBitsInGivenRange(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 set bits in the range
    # 'l' to 'r' in 'n'
    return countSetBits(n & num)
 
# Driver program to test above
n = 42
l = 2
r = 5
ans = countSetBitsInGivenRange(n, l, r)
print (ans)
 
# This code is contributed by Saloni Gupta.


C#
// C# implementation to count set 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 set bits in the given range
    static int countSetBitsInGivenRange(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 set bits in the range
        // 'l' to 'r' in 'n'
        return countSetBits(n & num);
    }
     
    //Driver code
    public static void Main()
    {
        int n = 42;
        int l = 2, r = 5;
         
        Console.WriteLine(countSetBitsInGivenRange(n, l, r));
    }
}
 
// This code is contributed by Anant Agarwal.


PHP


Javascript


输出:

2