The text buffering widget I'm building allows the user to apply filters to the text. A need arose to combine various filters, say given 3 filters, each combination is also a filter (i.e. filter 1 and 2 are active, filters 2 and 3 are active, etc.)

Given the basic filters, to compute the combinations one runs into an interesting problem: given a set S={a,b,c} find all combinations of its members.

In mathematical terms this is called a power set of S - namely, the set of all subsets of S. In our case, the power set of S is:

{}, {a}, {b}, {c}, {a,c}, {a,b}, {b,c}, {a,b,c}

So, given the set S as a vector in C++ I need to generate another vector - the power set.

Fortunately, arithmetic in binary base gives us a very nice way to enumerate the subsets.

Given a set size N, consider the binary representation of the numbers 0..N-1:

000, 001, 010, 011, 100, 101, 110, 111

If we think of 0 as "not included" and 1 as "included" we get exactly the power set.

So, in C++ it's a simple matter of looping all the numbers between 0 and N-1, and for each one check the inclusion of each set member - if the bit at place X is set, the Xth element is in the next set, etc.