From 8f18b92f6e19fe44595fb5c167a1b83d6ca4a16f Mon Sep 17 00:00:00 2001 From: Pratyush Singh <90026952+PratyushSingh07@users.noreply.github.com> Date: Wed, 14 Sep 2022 22:35:23 +0530 Subject: [PATCH] Add count set bits algorithm (#3262) --- .../thealgorithms/others/countSetBits.java | 46 +++++++++++++++++++ .../others/countSetBitsTest.java | 15 ++++++ 2 files changed, 61 insertions(+) create mode 100644 src/main/java/com/thealgorithms/others/countSetBits.java create mode 100644 src/test/java/com/thealgorithms/others/countSetBitsTest.java diff --git a/src/main/java/com/thealgorithms/others/countSetBits.java b/src/main/java/com/thealgorithms/others/countSetBits.java new file mode 100644 index 00000000..33be26fd --- /dev/null +++ b/src/main/java/com/thealgorithms/others/countSetBits.java @@ -0,0 +1,46 @@ +package com.thealgorithms.others; + +public class countSetBits { + /** + * The below algorithm is called as Brian Kernighan's algorithm + * We can use Brian Kernighan’s algorithm to improve the above naive algorithm’s performance. The idea is to only consider the set bits of an integer by turning off its rightmost set bit (after counting it), so the next iteration of the loop considers the next rightmost bit. + + The expression n & (n-1) can be used to turn off the rightmost set bit of a number n. This works as the expression n-1 flips all the bits after the rightmost set bit of n, including the rightmost set bit itself. Therefore, n & (n-1) results in the last bit flipped of n. + + For example, consider number 52, which is 00110100 in binary, and has a total 3 bits set. + + 1st iteration of the loop: n = 52 + + 00110100 & (n) + 00110011 (n-1) + ~~~~~~~~ + 00110000 + + + 2nd iteration of the loop: n = 48 + + 00110000 & (n) + 00101111 (n-1) + ~~~~~~~~ + 00100000 + + + 3rd iteration of the loop: n = 32 + + 00100000 & (n) + 00011111 (n-1) + ~~~~~~~~ + 00000000 (n = 0) + + * @param num takes Long number whose number of set bit is to be found + * @return the count of set bits in the binary equivalent + */ + public long countsetBits(long num){ + long cnt=0; + while(num>0){ + cnt++; + num&=(num-1); + } + return cnt; + } +} \ No newline at end of file diff --git a/src/test/java/com/thealgorithms/others/countSetBitsTest.java b/src/test/java/com/thealgorithms/others/countSetBitsTest.java new file mode 100644 index 00000000..b43c8d29 --- /dev/null +++ b/src/test/java/com/thealgorithms/others/countSetBitsTest.java @@ -0,0 +1,15 @@ +package com.thealgorithms.others; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; +public class countSetBitsTest { + @Test + void testSetBits(){ + countSetBits csb= new countSetBits(); + assertEquals(1L,csb.countsetBits(16)); + assertEquals(4, csb.countsetBits(15)); + assertEquals(5, csb.countsetBits(10000)); + assertEquals(5, csb.countsetBits(31)); + } +} \ No newline at end of file