diff --git a/src/main/java/com/thealgorithms/bitmanipulation/CountSetBits.java b/src/main/java/com/thealgorithms/bitmanipulation/CountSetBits.java index eb0886e30292..242f35fc35f2 100644 --- a/src/main/java/com/thealgorithms/bitmanipulation/CountSetBits.java +++ b/src/main/java/com/thealgorithms/bitmanipulation/CountSetBits.java @@ -48,4 +48,32 @@ public long countSetBits(long num) { } return cnt; } + + /** + * This approach takes O(1) running time to count the set bits, but requires a pre-processing. + * + * So, we divide our 32-bit input into 8-bit chunks, with four chunks. We have 8 bits in each chunk. + * + * Then the range is from 0-255 (0 to 2^7). + * So, we may need to count set bits from 0 to 255 in individual chunks. + * + * @param num takes a long number + * @return the count of set bits in the binary equivalent + */ + public int lookupApproach(int num) { + int[] table = new int[256]; + table[0] = 0; + + for (int i = 1; i < 256; i++) { + table[i] = (i & 1) + table[i >> 1]; // i >> 1 equals to i/2 + } + + int res = 0; + for (int i = 0; i < 4; i++) { + res += table[num & 0xff]; + num >>= 8; + } + + return res; + } } diff --git a/src/test/java/com/thealgorithms/bitmanipulation/CountSetBitsTest.java b/src/test/java/com/thealgorithms/bitmanipulation/CountSetBitsTest.java index 412312109bec..61e0757f9c12 100644 --- a/src/test/java/com/thealgorithms/bitmanipulation/CountSetBitsTest.java +++ b/src/test/java/com/thealgorithms/bitmanipulation/CountSetBitsTest.java @@ -14,4 +14,13 @@ void testSetBits() { assertEquals(5, csb.countSetBits(10000)); assertEquals(5, csb.countSetBits(31)); } + + @Test + void testSetBitsLookupApproach() { + CountSetBits csb = new CountSetBits(); + assertEquals(1L, csb.lookupApproach(16)); + assertEquals(4, csb.lookupApproach(15)); + assertEquals(5, csb.lookupApproach(10000)); + assertEquals(5, csb.lookupApproach(31)); + } }