сколько памяти доступно при какой задержке?Я бы предложил таблицу поиска; -)
, но серьезно: если вы выполняете это на 100-х числах, вам может понадобиться 8-битная таблица поиска, дающая 2 мсек, и еще одна 8-битная таблица поиска, дающая 1 мсек.,В зависимости от процессора, это может побить действительно считающий бит.
Для скорости я бы создал таблицу соответствия, отображающую входной байт в
M (I) = 0, если установлен 1 или 0 бит
M (I) = B 'в противном случае, где B' - это значение B с установленными битами в 2 мсек.
32-разрядный тип int - это 4 входных байта I1 I2 I3 I4.
Lookup M (I1), если ненулевое значение, все готово.
Сравнить M (I1) == 0, если ноль, повторить предыдущий шаг для I2.
Иначе, поиск I2 во второй таблице поиска с 1Биты MSB, если ненулевой, все готово.Иначе, повторите предыдущий шаг для I3.
и т. Д. И т. Д. На самом деле ничего не зацикливайте на I1-4, а разверните его полностью.
Суммирование: 2 таблицы поиска с 256 записями, 247 /256 случаев разрешаются одним поиском, примерно 8/256 - двумя поисками и т. Д.
редактировать: таблицы для ясности (входные данные, таблица битов 2 MSB, таблица битов 1 MSB)
I table2 table1
0 00000000 00000000
1 00000000 00000001
2 00000000 00000010
3 00000011 00000010
4 00000000 00000100
5 00000101 00000100
6 00000110 00000100
7 00000110 00000100
8 00000000 00001000
9 00001001 00001000
10 00001010 00001000
11 00001010 00001000
12 00001100 00001000
13 00001100 00001000
14 00001100 00001000
15 00001100 00001000
16 00000000 00010000
17 00010001 00010000
18 00010010 00010000
19 00010010 00010000
20 00010100 00010000
..
250 11000000 10000000
251 11000000 10000000
252 11000000 10000000
253 11000000 10000000
254 11000000 10000000
255 11000000 10000000