first you have to understand what 1 << k means. “<<” is the bit-shift operator (to the left). This means that if k = 1, 1 is moved 1 position to the left.

k = 1 (decimal) => 0001 (binary) << 1 = 0010 (binary) = 2 (decimal)

k = 2 (decimal) => 0001 (binary) << 2 = 0100 (binary) = 4 (decimal)

and so on…

“&” is the bit-wise and operator. It takes two integers, looks at their binary representation and returns an integer that has 1 in the binary representation at every position where the two input integers both have a 1.

Example:

a = 5 (decimal) = 0101 (binary)

b = 3 (decimal) = 0011 (binary)

=> a & b = 0101 & 0011 = 0001 (binary) = 1 (decimal)

a = 2d = 0010b

b = 6d = 0110b

=> a & b = 0010b & 0110b = 0010b = 2

In this algorithm, the right side of the bit-wise and is always a power of 2. This means that the binary representation has exactly one 1 in it and every other position is 0.

In general: 1 << k = 2^k

So i & 1 << k basically checks if the number i has a 1 at position k in its binary representation. If yes, element k is included in subset i.

I hope this helps you

]]>BTW, may I ask what does “i&1 << k" mean? ]]>