/****************************************************************************
* Author: Isai Damier
* Title: Count Bits
* Project: geekviewpoint
* Package: algorithms
*
* Statement:
* Count the number of 1s in the given bit sequence.
*
* Sample Input: integer representation of bit sequence 1000110010
* Sample Output: 4
*
* Technical Details: Mumerous techniques have been devised to
* count the number of bits in a bit sequence. The simplest way
* to internalize why a given technique works is to take a
* pencil and run though a few examples.
*
* The presented approach runs through a loop and clears the
* lowest set bit of n during each iteration. When no set bit
* is left (i.e. n==0) the number of iterations is returned.
*
* 0] Set count to 0
* 1] while n > 0:
* -- clear the least significant bit in n: n &= (n-1)
* -- increment count by 1: count++
* 2] return count.
*
* Alternate Algorithm: e.g. n = n & ~(n & ~(n-1));
***************************************************************************/
public int countBits(int n) {
if (0 == n) {
return n;
}
int count = 0;
while (0 != n) {
n &= (n - 1);
count++;
}
return count;
}
import org.junit.Test;
import static org.junit.Assert.*;
public class BitwiseTest {
/**
* Test of countBits method, of class Bitwise.
*/
@Test
public void testCountBits() {
System.out.println(""countBits"");
Bitwise bits = new Bitwise();
String[] set = {""0000000000"", ""0000001000"", ""0001010000"",
""1100001000"", ""1000110010"", ""0101110001"", ""1100101101"",
""1101110101"", ""1101111011"", ""1111101111"", ""1111111111""};
for (int i = 0; i < set.length; i++) {
assertEquals(i, bits.countBits(Integer.parseInt(set[i], 2)));
}
}
}