c - 什么是计算 floor(log(m/n)) 的有效方法,其中 m 和 n 是整数?

标签 c assembly optimization micro-optimization

基本上,正如标题所说。我想知道一种计算方法 floor(log2(x / y)) ,其中 xy是非零无符号机器整数,在尽可能少的周期内(尽可能避免使用分支、内存带宽、除法等在这样的小代码段中开销很大的东西)。这里需要准确的(整数)答案。我在想如何优化Adaptive Shivers Sort的外循环通过高效计算,因为它需要计算 floor(log2(r / c)) ,其中 r是游程长度和 c算法的元参数;假设的解决方案 x <= y将适用于此类的离线版本,其中 c被选择为等于输入的长度,但通用解决方案在其他设置中可能有用。
您可以假设使用 PopCountCountLeadingZeros/CountTrailingZeros ,常见的 SSE 风格指令,甚至浮点计算——但它需要处理器可以在几个周期内完成。

最佳答案

像这样的事情怎么样,部分灵感来自 NXTangl 的评论?申请 clz两者 xy并将它们都移位,使它们的前导位位于最高位位置(31 或 63)。让 k是这两个移位量之间的差值。现在要么kk-1是您正在寻找的结果,您可以通过哪个移位值更大来区分情况。

关于c - 什么是计算 floor(log(m/n)) 的有效方法,其中 m 和 n 是整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62646578/

相关文章:

c++ - 使用内联函数是否与直接在代码中编写函数体一样快?

c++ - powerdns + mongodb

c - int ** 数组变化值

c - 将 fgets 与 realloc() 结合使用

c - 读取文本文件后拆分/解析字符串?

sql - 需要使用 JOIN 优化 SQL 查询的技巧

assembly , Hello World 问题

assembly - 在现有标签后两行设置 gdb 断点

assembly - x86:使用内存/交换值?

c - gcc: __fread_chk_warn 警告