Скажем, у меня есть 2 двоичных входа с именами IN и MASK. Фактический размер поля может составлять от 32 до 256 бит в зависимости от того, какой набор команд используется для выполнения задачи. Оба входа меняют каждый звонок.
Inputs:
IN = ...1100010010010100...
MASK = ...0001111010111011...
Output:
OUT = ...0001111010111000...
редактировать: еще один пример результата из обсуждения некоторых комментариев
IN = ...11111110011010110...
MASK = ...01011011001111110...
Output:
OUT = ...01011011001111110...
Я хочу получить смежные смежные 1 бит MASK, внутри которых находится 1 бит IN. (Есть ли общий термин для такого рода операций? Может быть, я неправильно формулирую свои поиски.) Я пытаюсь найти способ сделать это немного быстрее. Я открыт для использования любых расширений SIMD x86 или x86, которые могут сделать это за минимальные циклы ЦП. Предпочтителен более широкий тип данных SIMD, поскольку он позволяет обрабатывать больше данных одновременно.
Лучшее наивное решение, которое я придумал, это следующий псевдокод, который вручную сдвигает влево до тех пор, пока не останется больше совпадающих битов, а затем повторяет сдвиг вправо:
// (using the variables above)
testL = testR = OUT = (IN & MASK);
LoopL:
testL = (testL << 1) & MASK;
if (testL != 0) {
OUT = OUT | testL;
goto LoopL;
}
LoopR:
testR = (testR >> 1) & MASK;
if (testR != 0) {
OUT = OUT | testR;
goto LoopR;
}
return OUT;