Ваша цель состоит в том, чтобы создать функцию или программу для обращения битов в диапазоне целых чисел с заданным целым числом n . Другими словами, вы хотите найти перестановку перестановок битов в диапазоне 2 n элементов с нулевым индексом. Это также последовательность OEIS A030109 . Этот процесс часто используется при вычислении быстрых преобразований Фурье, таких как встроенный алгоритм Кули-Тьюки для БПФ. Существует также проблема для вычисления БПФ для последовательностей, где длина равна степени 2.
Этот процесс требует от вас итерации в диапазоне [0, 2 n -1] и преобразования каждого значения в двоичное и обращения битов в этом значении. Вы будете рассматривать каждое значение как n- значное число в базе 2, что означает, что обращение будет происходить только среди последних n битов.
Например, если n = 3, диапазон целых чисел равен [0, 1, 2, 3, 4, 5, 6, 7]
. Эти
i Regular Bit-Reversed j
0 000 000 0
1 001 100 4
2 010 010 2
3 011 110 6
4 100 001 1
5 101 101 5
6 110 011 3
7 111 111 7
где каждый индекс i преобразуется в индекс j с использованием обращения битов. Это означает, что на выходе [0, 4, 2, 6, 1, 5, 3, 7]
.
Выходными данными для n от 0 до 4 являются
n Bit-Reversed Permutation
0 [0]
1 [0, 1]
2 [0, 2, 1, 3]
3 [0, 4, 2, 6, 1, 5, 3, 7]
Возможно, вы заметили формирование шаблона. Учитывая n , вы можете взять предыдущую последовательность для n -1 и удвоить ее. Затем объедините этот двойной список с тем же двойным списком, но увеличенным на единицу. Показывать,
[0, 2, 1, 3] * 2 = [0, 4, 2, 6]
[0, 4, 2, 6] + 1 = [1, 5, 3, 7]
[0, 4, 2, 6] ⊕ [1, 5, 3, 7] = [0, 4, 2, 6, 1, 5, 3, 7]
где ⊕
представляет конкатенацию.
Вы можете использовать любой из двух методов выше, чтобы сформировать свое решение. Если вы знаете лучший способ, вы можете использовать его тоже. Любой метод хорош, если он выводит правильные результаты.
правила
- Это код-гольф, поэтому выигрывает самое короткое решение.
- Встроенные функции, которые решают эту проблему в целом, и встроенные средства, которые вычисляют обращение битов значения, не допускаются. Это не включает встроенные функции, которые выполняют двоичное преобразование или другие побитовые операции.
- Ваше решение должно быть, по крайней мере, действительно для n от 0 до 31.
0
вместо [0]
или это должен быть список?
IntegerReverse[Range[2^#]-1,2,#]&
. (Я не знаю, зачем Mathematica нужна эта встроенная система, но я думаю, что это не намного страннее, чемSunset
...)