Всех с Новым годом!;-)
Есть беззнаковое целое (64 бита) число. вида ... b3 b2 b1 b0 где bi - бит на соотв. позиции (в двоичной сист счисления). Нужно превратить его в ... b3 0 0 b2 0 0 b1 0 0 b0, те напихать между битами исходного числа некоторое кол-во нулей, число нулей известно на этапе компиляции, результат заведомо поместиться в 64 бита. Производительность решения КРАЙНЕ важна. Исходные числа до 2^20 (чаще ~ 2^8-2^10).
Мне пока придумалось три варианта:
1) в цикле дергать каждый бит по отдельности и двигать его на нужную позицию. Очень долго.
2) Завести массив, индексом является исходное число, значением результат преобразования. Не то что жалко памяти, но для больших диапазонов могут возникнуть проблемы с кэшированием этого массива, и опять таки все встанет.
3) Промежуточный вариант - завести массив скажем на 2^8 значений, дальше преобразовывать исходное число кусками. Быстрее чем первый, но свои заморочки тоже есть.
У кого нить еще какие нить мысли будут? Может там какие нить хитрые операции есть...