【问题标题】:Which count set bit function has the better performance? [duplicate]哪个计数设置位功能具有更好的性能? [复制]
【发布时间】:2021-03-11 09:14:25
【问题描述】:
int a(int i) {
  int c = 0;
  while(i > 0) {
    if(i&1){c++;}
    i >>= 1;
  }
  return c;
}

// what does this function do?
int b(int i) {
  static char chs[] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
  int c = 0;
  while(i > 0) {
    c += chs[15&i];
    i >>= 4;
  }
  return 0;
}

如何使用 gettimeofday() 函数来验证它们的性能,哪个性能更好?我不熟悉count bit,所以请解释更多细节。谢谢!

【问题讨论】:

    标签: c


    【解决方案1】:

    第一个函数循环遍历给定的数字,一次检查一位,而第二个函数检查四位组——因此它的循环迭代次数将减少四倍(理论上,至少†) 比第一个。

    它的工作原理是将数字“屏蔽”到值15,十六进制为0xF,二进制为0b1111;因此,在每个循环中,表达式i&15(用作数组索引)提取由最低四位表示的数字;数组chs 是一个预定义列表,其中列出了在提取的数字的每个可能值中设置了多少位:将适当的值添加到运行总数中,然后将数字中的位向下移动 4地点(i >>= 4 操作)。


    我说,“理论上”,因为许多编译器将能够优化为您的一个或两个函数/循环生成的代码,因此预测哪个是最有效的并不是小事一桩。

    此外,在测试数减少到零之前所需的循环数将在很大程度上取决于该数的初始值,因此,如果您的测试数偏向低值,那么循环数的减少将变为不太重要。

    【讨论】:

      【解决方案2】:

      第二个功能会更有效率。它计算每一步最后 4 位中设置的位数。然后使用i >>= 4修剪最后4位

      【讨论】:

        猜你喜欢
        • 2011-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-18
        • 1970-01-01
        • 2019-05-06
        • 1970-01-01
        相关资源
        最近更新 更多