以下は、私がインタビューストリートのウェブサイトで見た C++ コードで、0 から a (入力番号) までの 1 のビットをカウントします。ただし、0 には 1 がないため、1 ~ a と言えます。このコードの時間計算量は、再帰を使用して O(logn) です。
ただロジックがわかりません。誰でも理由を説明できますか?どうも!
long long solve(int a)
{
if(a == 0) return 0 ;
if(a % 2 == 0) return solve(a - 1) + __builtin_popcount(a) ;
return ((long long)a + 1) / 2 + 2 * solve(a / 2) ;
}
BTW __builtin_popcount() は、1 であるビットをカウントするために GNU が提供する組み込みメソッドです。