int fn(unsigned int x)
{
int count = 0 ;
for(; x!=0; x&=(x-1))
count ++;
return count;
}
Я попробовал это в компиляторе, но не мог понять, что происходит. Я думаю, что это связано с количеством битов в x
, но что?
Я объясняю, что вы сделали 🙂
Согласно вашему коду, произойдет следующее, если x = 5
1) В первой итерации цикла
a) condition check : .... 0101(X) ! = 0 ,
b) body : count will be 1 ;
c) increment part : .... 0101 &= .... 0100 => .... 0100
2) Во второй итерации
a) condition check : .... 0100(X) ! = 0 ,
b) body : count will be 2 ;
c) increment part : .... 0100 &= .... 0011 => .... 0000
Количество равно 2, которое является количеством битов, установленных в X (5)
Это хитрость. 🙂
Вы возвращаете количество битов, установленных в 1
,