如何在很长的时间内找到单个位设置的位置

时间:2017-05-12 17:27:45

标签: java performance optimization

我有一个长的单位设置,我需要知道它是什么,例如指数。我需要尽快计算出来。 天真的想法是除以2并检查结果是否为1.但这需要多达63次迭代(最坏情况)。

我的下一个想法是像二进制搜索一样,例如看看它是63-32或31-0然后是63-48,47-31,31-16,15-0等等有很多if-else语句,但这给了我一堆代码。 ..

此外,我希望尽量减少对象的创建和使用的内存。您可能会建议我使用Java时错了,应该使用C / C ++。那么它适合学校比赛而且我没有选择:)

我想看一些示例代码!

2 个答案:

答案 0 :(得分:4)

使用Long.numberOfTrailingZeros - 这将是您正在寻找的索引。

如果从最高位开始计算位数,

Long.numberOfLeadingZeros也很有用。

这两种方法都是JVM内在函数,即它们由JIT编译器专门处理。这些方法被转换为特殊的CPU指令(TZCNT / LZCNT),因此非常有效。

答案 1 :(得分:-2)

你可以准备一个Map<Int, Int>,保存每个可能值的设置位数,但我不确定它是否真的比循环更快。

也许比特移位比除以2更快。