Другим подходом, который может быть выгодным, будет создание массива из 256 элементов,
который кодирует действия, которые вам нужно предпринять при увеличении массива count.
Ниже приведен пример таблицы из 4 элементов, в которой 2 бита вместо 8 бит.
int bitToSubscript[4][3] =
{
{0}, // No Bits set
{1,0}, // Bit 0 set
{1,1}, // Bit 1 set
{2,0,1} // Bit 0 and bit 1 set.
}
Затем алгоритм вырождается в:
- выбрать 2 правые биты числа.
- Используйте это как маленькое целое число для индексации в bitToSubscriptArray.
- В этом массиве выведите первое целое число. Это количество элементов в массиве count, которое необходимо увеличить.
- Основываясь на этом количестве, перебирайте оставшуюся часть строки, увеличивая количество, основываясь на индексе, который вы извлекаете из массива bitToSubscript.
- Как только этот цикл будет завершен, сдвиньте исходное число на два бита вправо ... Промыть Повторите при необходимости.
Теперь есть одна проблема, которую я проигнорировал в этом описании. Фактические подписки являются относительными. Вы должны отслеживать, где вы находитесь в массиве count. Каждый раз, когда вы делаете цикл, вы добавляете два к смещению. К этому смещению вы добавляете относительный индекс из массива bitToSubscript.
На этом небольшом примере должно быть возможно масштабирование до нужного размера. Я думаю, что можно использовать другую программу для генерации исходного кода для массива bitToSubscript, чтобы его можно было просто жестко кодировать в вашей программе.
Существуют и другие варианты этой схемы, но я ожидаю, что она будет работать в среднем быстрее, чем все, что делает это по одному разу.
Доброй охоты.
Evil.