When interviewing new candidates, we usually ask them to write a piece of C code to count the number of bits with value 1 in a given byte variable (e.g. the byte 3 has two 1-bits). I know all the common answers, such as right shifting eight times, or indexing constant table of 256 precomputed results.
But, is there a smarter way without using the precomputed table? What is the shortest combination of byte operations (AND, OR, XOR, +, -, binary negation, left and right shift) which computes the number of 1-bits?
There are at least two faster solutions, with different performance characteristics:
Subtract one and AND the new and old values. Repeat until zero. Count the number of iterations. Complexity: O(B), where B is the number of one-bits.
Add pairs of bits then groups of four, then groups of eight, till you reach the word size. There’s a trick that lets you add all groups at each level in a single pass. Complexity: O(log(N)), where N is the total number of bits.
This version is a bit naive. If you think about it a bit, you can avoid some of the operations.