这实际上是log base 2,但在我所处的环境中,我无法访问此功能手动遍历位以验证它们的速度慢得令人无法接受如果它只有4位,我可能会索引它并在数组中浪费一些空间,但是64位是不可行的。
有没有什么聪明的常数时间法来确定哪一位被设置了?(数量是64位数字)。
编辑:为了澄清,数字中有一个位集。

最佳答案

我知道最快的方法是使用DeBruijn Sequence
Find the log base 2 of an N-bit integer in O(lg(N)) operations with multiply and lookup
注意,在lg(N)中,N是位的数目,而不是最高设置位的数目所以对于任何N位数字来说都是常数时间。
如果你知道这个数字是2的精确幂(也就是说,只有1位集),那么在它下面还有一个更快的方法。
那个黑客是32位的我似乎记得在某个地方看到过一个64位的例子,但目前还无法找到。最坏的情况是,运行两次:一次用于高32位,一次用于低32位。

关于algorithm - 找出以64位为单位设置哪个位的有效方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18364618/

10-10 16:19