给定一个unsigned int,我必须执行以下操作:

  • 计算设置为1的位数
  • 查找最左边1位的索引
  • 查找最严格的1位
  • 的索引

    (该操作不应依赖于体系结构)。

    我已经使用按位移位完成了此操作,但是我必须遍历几乎所有位(es.32)。
    例如,计算1:
    unsigned int number= ...;
    while(number != 0){
        if ((number & 0x01) != 0)
            ++count;
        number >>=1;
    }
    

    其他操作类似。

    所以我的问题是:有没有更快的方法呢?

    最佳答案

    如果您想要最快的方法,则需要使用非便携式方法。

    Windows/MSVC:

  • _BitScanForward()
  • _BitScanReverse()
  • __popcnt()

  • 海湾合作委员会:
  • __builtin_ffs()
  • __builtin_ctz()
  • __builtin_clz()
  • __builtin_popcount()

  • 这些通常直接映射到 native 硬件指令。因此,没有比这些更快的了。

    但是由于它们没有C/C++功能,因此只能通过编译器内部函数访问它们。

    关于c++ - 高效的按位运算,用于对位进行计数或找到最右边的|最左边的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9093323/

    10-09 06:38