PROBLEM DESCRIPTION
You are given a number N. Find the total number of setbits in the numbers from 1 to N.
SOLUTION
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution{
static int countBits(int A){
//base case
if(A == 0) return 0;
//highest power of 2, which is less than or equal to A
long x = logBase2(A);
//number of 1s present in each bit position = 2^x / 2
long numerOfOnesInEachPosition = (1<<x)/2;
//how many positions have any set bits?
long totalNumberOfPositions = x;
//all the remaining numbers from 2^x to A will have set bit in its MSB
long msbContributionForRemainingNumbers = (A - (1<<x) + 1);
//current total = (total number of set bits upto 2^x - 1) + (set bits in the MSB in the remaining numbers)
long currentTotal = (numerOfOnesInEachPosition * totalNumberOfPositions) + msbContributionForRemainingNumbers;
//if we carefully observe, (A / 2^x) is now a sub-problem. So, calculate that using recursion and add that to the currentTotal
long contributionByRemaining = countBits( A - (1<<x) );
return (int)(currentTotal + contributionByRemaining);
}
public static long logBase2(long n){
long c = 0;
while(n > 1){
c++;
n = n/2;
}
return c;
}
}