基本上,正如标题所说。我想知道一种计算方法 floor(log2(x / y))
,其中 x
和 y
是非零无符号机器整数,在尽可能少的周期内(尽可能避免使用分支、内存带宽、除法等在这样的小代码段中开销很大的东西)。这里需要准确的(整数)答案。我在想如何优化Adaptive Shivers Sort的外循环通过高效计算,因为它需要计算 floor(log2(r / c))
,其中 r
是游程长度和 c
算法的元参数;假设的解决方案 x <= y
将适用于此类的离线版本,其中 c
被选择为等于输入的长度,但通用解决方案在其他设置中可能有用。
您可以假设使用 PopCount
和 CountLeadingZeros/CountTrailingZeros
,常见的 SSE 风格指令,甚至浮点计算——但它需要处理器可以在几个周期内完成。
最佳答案
像这样的事情怎么样,部分灵感来自 NXTangl 的评论?申请 clz
两者 x
和 y
并将它们都移位,使它们的前导位位于最高位位置(31 或 63)。让 k
是这两个移位量之间的差值。现在要么k
或 k-1
是您正在寻找的结果,您可以通过哪个移位值更大来区分情况。
关于c - 什么是计算 floor(log(m/n)) 的有效方法,其中 m 和 n 是整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62646578/