Я думаю, что невозможно (без таблицы поиска) сделать это за меньшее количество операций, используя двоичную арифметику и архитектуру процессора x86 или x64.Поправь меня, если я ошибаюсь, но твоя проблема в перемещении битов.Имея abcd
бит, вы хотите получить 0a0b0c0d
бит за одну операцию.Проблема начинается, когда вы посмотрите, сколько битов должны пройти «a», «b», «c» и «d».
'a' was 4-th, became 7-th, distance travelled 3 bits
'b' was 3-rd, became 5-th, distance travelled 2 bits
'c' was 2-nd, became 3-rd, distance travelled 1 bit
'd' was 1-st, became 1-st, distance travelled 0 bits
Нет такой инструкции процессора, которая будет перемещать этибиты динамически на другое расстояние.Хотя, если у вас есть разные входные представления одного и того же числа бесплатно, например, вы предварительно рассчитали несколько значений, которые вы используете в цикле, то, возможно, удастся добиться некоторой оптимизации, это эффект, который вы получаете при использовании дополнительных знанийо топологии.Вам просто нужно выбрать, будет ли это:
[4 cycles, n^0 memory]
[2 cycles, n^1 memory]
[1 cycle , n^2 memory]