用条件循环每个数字的最快方法

时间:2010-10-14 08:17:41

标签: c performance bit-manipulation bitwise-operators

给定64位整数,其中要评估的最后52位和前12位将被忽略,将7位开启和所有其他位关闭的最快方法是什么?

示例:

第一种排列:

0[x57]1111111

最后的排列

00000000000011111110[x45]

0[xn]表示n off(零)位。

速度绝对至关重要,我们希望节省每个时钟周期,因为它是需要在合理的时间内评估数十亿个州的更大解决方案的一部分。

不需要工作解决方案,但是一些伪代码可以正常运行:)

3 个答案:

答案 0 :(得分:10)

我想你会对这篇文章感兴趣:http://realtimecollisiondetection.net/blog/?p=78

它以非常有效的方式解决了您的问题。

答案 1 :(得分:4)

您需要的是一种优秀的算法,可以在最短的时间内将您从一个排列转移到下一个排列。

现在,我想到的第一个算法就是通过七个循环来完成所有组合。

  • 第一个循环遍历52位,为下一个循环设置一个。
  • 第二个循环遍历设置之后的位,为第三个循环设置一个。
  • ... ECT

这将为您提供最快的迭代。这是一些伪C ++代码:

__int64 deck;
int bit1, bit2, bit3, ...;
for (bit1=0;bit1<52-6;bit1++) {
  for (bit2=bit1+1;bit2<52-5;bit2++) {
    ...
      for (bit7=bit6+1;bit7<52;bit7++) {
        deck = (1<<bit1)+(1<<bit2)+(1<<bit3)+...;  // this could be optimized.
        // do whatever with deck
      }
    ...
  }
}

//注意:52-6,52-5将由编译器预先计算,为方便起见。您不必担心优化此问题。

那里有你的解决方案。如果你想检查它是否有效,我总是缩减它。例如,在4位数字上遵循该算法,您需要设置2位,如下所示:

1100
1010
1001
0110
0101
0011

答案 2 :(得分:1)

我认为每个排列之间存在关系。

alt text

我们可以看到数字随着排列方式的增加而增加#。

这个数学对于所有解决方案都不正确,但适用于某些人,希望能说出我的意思:

Permutation 3 difference = ((3%7+1)^2) * (roundUp(3/7) = 16
Permutation 10 difference = ((10%7+1)^2) * (roundUp(10/7) = 32

所以我们将从绝对值循环:

int perm = 1;
for int64 i = 127; perm < totalPermutations
{
    i = i + ((perm%7+1)^2) * (roundUp(perm/7);
    perm++;
}

再次数学是错误的,但是给出了一个想法,我相信有可能为此提出一个公式。至于它是否优于按位运算则必须进行测试。