我有一个长的单位设置,我需要知道它是什么,例如指数。我需要尽快计算出来。 天真的想法是除以2并检查结果是否为1.但这需要多达63次迭代(最坏情况)。
我的下一个想法是像二进制搜索一样,例如看看它是63-32或31-0然后是63-48,47-31,31-16,15-0等等有很多if-else语句,但这给了我一堆代码。 ..
此外,我希望尽量减少对象的创建和使用的内存。您可能会建议我使用Java时错了,应该使用C / C ++。那么它适合学校比赛而且我没有选择:)
我想看一些示例代码!
答案 0 :(得分:4)
使用Long.numberOfTrailingZeros
- 这将是您正在寻找的索引。
Long.numberOfLeadingZeros
也很有用。
这两种方法都是JVM内在函数,即它们由JIT编译器专门处理。这些方法被转换为特殊的CPU指令(TZCNT / LZCNT),因此非常有效。
答案 1 :(得分:-2)
你可以准备一个Map<Int, Int>
,保存每个可能值的设置位数,但我不确定它是否真的比循环更快。
也许比特移位比除以2更快。