K&Rを勉強中の初学者です。
演習2-9で分からないところがあるので、おしえていただきたいのです。

コードの改良は、

int bitcount (unsigned x)
{
int b;

for (b=0;(x=(x & (x-1)) != 0;b++)
    ;
return b;
}

でいいんじゃないかと思うのですが、

2の補数システムではなぜそうなるか、の説明がよくわかんないです。

最も右の1ビットから下位ビットが1の補数となり、&によって、0がセットされるため、
最も右の1ビットが消える。

では、ちょっと的外れのようなので、正しい理由を教えていただきたく思います。
もちろん、コードの間違いもありましたら、お願いします。