procedure bit count(S: bit string)
count := 0
while S != 0
count := count + 1
S := S ∧ (S − 1)
return count {count is the number of 1s in S}
ここで、S-1 は、S の右端の 1 ビットを 0 に変更し、その右側のすべての 0 ビットを 1 に変更したビット列です。
なぜこれが正しいのか理解できたので、大まかな説明を書きました。
すべての反復の後、S の右端の 1 ビットとその右側のすべてのビットが 0 に等しく設定されます。文字列全体が 0 であり、1 の数に等しいカウントでループが中断されます。
この種の答えはどの数学コミュニティにも通用しないことを知っているので、正式な証明を書きたいと思っていましたが、それを行う方法がわかりません。私の証明スキルは特にお粗末なので、関連するテクニックの説明をいただければ幸いです。