求X=N/2+N/4+N/8+N/16+...
公式中的N是自然数,除法是整数除法(向下取整)。
这个公式是从《编程之美》阶乘一章摘来的,除了硬算之外,里面给出了另一个答案:X=N-(N的二进制表示中1的数目)。
但是书中用11011为例证明这个结论太复杂了,看不懂,我想了另外一个解读:
N
= (N的二进制最低位 + N/2) + N/2
= (N的二进制最低位 + N/2) + (N/2的二进制最低位 + N/4) + N/4
...
= (N的二进制最低位 + N/2的二进制最低位 + ...) + (N/2 + N/4 + ...)
= N的二进制中1的个数 + X
求1的个数在书上也介绍了O(1)的查表法,即使对于int32也成立(拆成4个字节查4次表)。因此这种方法比起硬算的O(log n)稍微快些。