Вот несколько более быстрая версия моего решения выше; вместо смещения влево и вправо, просто поверните:
int leftRotate(unsigned int n, unsigned int d)
{
return (n << d)|(n >> (32 - d));
}
// Return non-zero iff some element is in both a and b.
int IsIntersectionNonEmpty(unsigned int a, unsigned int b)
{
for (int i = 0; i < 5; i++) {
unsigned int matches = leftRotate(a, i*6) ^ b;
for (int j = 0; j < 5; j++) {
unsigned int testval = 0x3f << j*6;
if (matches & testval == testval)
return 1; // success
}
}
return 0;
}
5 инструкций во внешней l oop, 3 во внутренней * 5, итого 20, 5 циклов, около 100 инструкций - но как только он находит совпадение, он возвращается. Так что, если есть частые совпадения, это, вероятно, будет быстрее, чем версия @ eri c -postpischil, но без совпадений это будет медленнее. С другой стороны, его решение, вероятно, автоматически векторизуемо с помощью умного компилятора.