v & 1 is 1 if the lowest bit in v is set, and 0 if it's not.
The loop keeps dividing shifting the bits of vright by 1 place each iteration, and thus the lowest bit of v loops over each of the bits in the original v (as each one gets to the 1's place before "falling off" the fractional end).
Thus, it loops over each bit and adds 1 to c if it's set, and adds 0 if it's not, thus totaling the set bits in the original v.
For example, with a starting v of 1011:
- 1011 & 1 = 1, so c is incremented to 1.
- Then 1011is shifted to become101.
- 101 & 1 = 1, so c is incremented to 2.
- 101is shifted to become- 10.
- 10 & 1 = 0, so c isn't incremented and remains 2.
- 10is shifted to become- 1.
- 1 & 1 = 1, so c is incremented to 3.
- 1is shifted to become- 0(because the last bit fell off the fractional end).
- Since the condition of the forloop is justv, and v is now 0, which is a false value, the loop halts.
End result, c = 3, as we desire.