求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)稍微快些。

posted @ 2020-07-05 19:43  Xrst  阅读(1211)  评论(0编辑  收藏  举报