Por que essa função conta o número de bits definidos em um número inteiro

Fiz a seguinte pergunta em uma entrevista:

int foofoo(unsigned int u) {
    unsigned int foo = u;
    do{
        u = u/2;
        foo -= u;
    }while(u > 0);
    return foo;
}

Pediram-me para dizer o que essa função faz e fui capaz de descobrir que conta o número de bits definidos em um valor int sem sinal, mas não consegui provar isso, talvez alguém possa?

questionAnswers(4)

yourAnswerToTheQuestion