【发布时间】:2013-03-05 20:08:00
【问题描述】:
在二进制表示中,汉明权重是 1 的个数。我在网上找到了一个 O(1) 的答案:
v = v - ((v>>1) & 0x55555555);
v = (v & 0x33333333) + ((v>>2) & 0x33333333);
int count = ((v + (v>>4) & 0xF0F0F0F) * 0x1010101) >> 24;
但是我不太了解该算法,也无法在任何地方找到它的描述。谁能解释一下,尤其是最后一行(*0x1010101 然后 >> 24 到底是什么意思)?
【问题讨论】:
-
旁注:它实际上不是
O(1)。比特数是O(log(n)),而简单的循环是O(n)。对于固定的整数大小,这个循环和直接循环都是O(1)。 -
@Mysticial 是的,如果我们考虑 32 位整数,它们都是 O(1)。但是这个应该比迭代计数快吧?
-
@NSF - 是的,它可能比迭代计数更快(尽管它确实有乘法,所以......),但这不是 Big-Oh 分析的目的。 Big-Oh 指的是运行时间作为输入大小的函数增长的速度。在 Big-Oh 中,线性计数为 O(n),而此算法为 O(log(n)),渐近性确实更好,但有时可能需要特定的 n 值才能使渐近性更快的算法性能更好.
-
我不确定这是否算作
O(log(n))。它是O(log(n))timewise,是的,但它通过要求O(n)并行化来实现这一点,以某种方式加起来O(n)总计算能力(如果你在整个 [大] 文件)。
标签: algorithm bit-manipulation