Ваша мета - створити функцію або програму для перетворення бітів у діапазоні цілих чисел із заданим цілим числом n . Іншими словами, ви хочете знайти перестановку бітів для діапазону 2 n елементів, нульове індексування. Це також послідовність OEIS A030109 . Цей процес часто використовується для обчислення швидких перетворень Фур'є, таких як місцевий алгоритм Cooley-Tukey для FFT. Існує також завдання для обчислення FFT для послідовностей, де довжина є потужністю 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
...)