diff --git a/algorithms/Java/README.md b/algorithms/Java/README.md index e19b83b4..b891f7c6 100644 --- a/algorithms/Java/README.md +++ b/algorithms/Java/README.md @@ -83,3 +83,6 @@ ## Backtracking - [N Queen Problem](backtracking/nqueen.java) + +## Bit Manipulation +- [Count Set Bits](bit-manipulation/count-set-bits.java) diff --git a/algorithms/Java/bit-manipulation/count-set-bits.java b/algorithms/Java/bit-manipulation/count-set-bits.java new file mode 100644 index 00000000..4e21e2b8 --- /dev/null +++ b/algorithms/Java/bit-manipulation/count-set-bits.java @@ -0,0 +1,83 @@ +/** Problem Description : + * You are given a number N. Find the total count of set bits for all numbers from 1 to N + * including 1 and N + */ + + +/** + * Author : Suraj Kumar + * Github : https://github.com/skmodi649 + */ + + +/** ALGORITHM : + * So, we will iterate till the number of bits in the number. + * And we don’t have to iterate every single number in the range from 1 to n. + * We will perform the following operations to get the desired result. + * The quotient when n+1 is divided by 2 will return the number of times the 0,1 pattern has appeared at LSB. + * However, the quotient when n+1 is divided by 4 will return the number of times the 0,0,1,1 pattern has + * appeared at 2nd least significant bit and so on. + */ + + +/** TEST CASES : + * Test Case 1 : + * Input: N = 4 + * Output: 5 + * + * Test Case 2 : + * Input: N = 17 + * Output: 35 + */ + +import java.util.*; +import java.lang.*; + + +class Solution { + + //Function to return sum of count of set bits in the integers from 1 to n. + public static int countSetBits(int n) { + int count = 0 , i = 1 , val = 0; + while ((n + 1) / (int) Math.pow(2, i) != 0) { + int k = (n + 1) % (int) Math.pow(2, i); + val = (n + 1) / (int) Math.pow(2, i); + int c = (int) Math.pow(2, i - 1); + count = count + c * val; + if (k > ((int) Math.pow(2, i) / 2)) { + count = count + (k - ((int) Math.pow(2, i) / 2)); + } + i++; + } + int temp = (int) Math.pow(2, i); + count += (n + 1 - temp / 2); + return count; + } + + public static void main(String[] args){ + Scanner sc = new Scanner(System.in); + System.out.println("Enter the number :"); + int n = sc.nextInt();//input n + + Solution obj = new Solution(); + System.out.println("Total set bits : "+obj.countSetBits(n)); // calling countSetBits method + System.out.println(); // changing the line + } + } + + + +/** Explanation for N = 4 + * For numbers from 1 to 4. + * For 1: 0 0 1 = 1 set bits + * For 2: 0 1 0 = 1 set bits + * For 3: 0 1 1 = 2 set bits + * For 4: 1 0 0 = 1 set bits + * Therefore, the total set bits is 5. + */ + + +/** Time Complexity : O(log N) +* Auxiliary Space Complexity : O(1) +* Constraints : 1 ≤ N ≤ 10^8 +*/