Вот способ, который позволяет избежать зацикливания на 32 бита.Он периодически очищает все биты, кроме самого левого, при подсчете их числа.
// x and y are the bits to compare
int z=x^y; // only bits different between x and y are set
int w;
int cnt=0;
while(w=z&-z) { //w only has the left bit in z set
cnt++;
z^=w; // clear the processed bit
}
Он основан на хорошо известном свойстве, что x&-x
равно младшему установленному биту веса в x
.
Внутренний цикл требует 5-ти миллиметровых инструкций.