基本上,如标题所述。我想知道一种计算
floor(log2(x / y))
的方法,其中x
和y
是非零无符号机器整数,尽可能少地使用循环周期(避免在此类代码中使用昂贵的分支、内存带宽、除法等)。这里需要精确的(整数)答案。我正在思考如何通过高效计算这个来优化自适应Shivers排序的外部循环,因为它需要计算floor(log2(r / c))
,其中r
是一个运行长度,c
是算法的元参数。假设x <= y
的解决方案可以用于此排序的离线版本,在该版本中,c
被选择为输入的长度,但通用解决方案可能在其他设置中也很有用。
您可以假设使用常见的SSE样式指令PopCount
和CountLeadingZeros/CountTrailingZeros
或浮点运算-- 但它需要是处理器可以在几个周期内完成的东西。