Как уже упоминали другие, язык ассемблера может дать лучшую производительность.Если это не вариант, вы можете рассмотреть следующую (непроверенную) процедуру.Это не совсем то, о чем вы просили, но оно должно быть достаточно близко, чтобы вы могли адаптировать его к вашим потребностям.
size_t findFirstNonFFbyte (
unsigned char const *buf, /* ptr to buffer in which to search */
size_t bufSize, /* length of the buffer */
size_t startHint /* hint for the starting byte (<= bufSize) */
) {
unsigned char * pBuf = buf + startHint;
size_t bytesLeft;
for (bytesLeft = bufSize - startHint;
bytesLeft > 0;
bytesLeft = startHint, pBuf = buf) {
while ((bytesLeft > 0) && (*pBuf == 0xff)) {
*pBuf++;
bytesLeft--;
}
if (bytesLeft > 0) {
return ((int) (pBuf - buf));
}
}
return (-1);
}
Для использования ...
index = findFirstNonFFbyte (...);
bit_index = index + bitTable[buffer[index]];
Дополнительные примечания:
Приведенный выше код будет проверять 8 бит за раз.Если вы знаете, что ваш буфер будет выровнен по 4 байтам, а его длина будет кратна 4 байтам, то вы можете одновременно тестировать 32-битный код с небольшим изменением (не забудьте вычисление возвращаемого значения).
Если ваш начальный бит не является подсказкой, а является абсолютным, вы можете пропустить цикл for.
Вам потребуется предоставить собственную таблицу поиска битов.Это должен быть массив длиной 256 байт.Каждая запись идентифицирует первый бит сброса байта, который индексирует эту запись.Личный опыт подсказывает мне, что разные люди будут по-разному считать эти биты.Некоторые называют бит 0 самым значимым битом байта;другие будут называть бит 0 наименее значимым битом байта.Какой бы стиль вы ни выбрали, будьте последовательны.
Надеюсь, это поможет.