Seu objetivo é criar uma função ou um programa para reverter os bits em um intervalo de números inteiros, dado um número inteiro n . Em outras palavras, você deseja encontrar a permutação de reversão de bits de um intervalo de 2 n itens, indexados a zero. Essa também é a sequência OEIS A030109 . Esse processo geralmente é usado na computação de transformadas rápidas de Fourier, como o algoritmo Cooley-Tukey para FFT no local. Há também um desafio para calcular a FFT para sequências em que o comprimento é uma potência de 2.
Esse processo requer que você itere no intervalo [0, 2 n -1] e converta cada valor em binário e inverta os bits nesse valor. Você tratará cada valor como um número de n dígitos na base 2, o que significa que a reversão ocorrerá apenas entre os últimos n bits.
Por exemplo, se n = 3, o intervalo de números inteiros é [0, 1, 2, 3, 4, 5, 6, 7]
. Esses são
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
onde cada índice i é convertido em um índice j usando inversão de bits. Isso significa que a saída é [0, 4, 2, 6, 1, 5, 3, 7]
.
A saída para n de 0 a 4 é
n Bit-Reversed Permutation
0 [0]
1 [0, 1]
2 [0, 2, 1, 3]
3 [0, 4, 2, 6, 1, 5, 3, 7]
Você pode ter notado uma formação de padrão. Dado n , você pode pegar a sequência anterior para n -1 e dobrá-la. Em seguida, concatene essa lista dobrada para a mesma lista dupla, mas incrementada em uma. Mostrar,
[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]
onde ⊕
representa concatenação.
Você pode usar um dos dois métodos acima para formar sua solução. Se você conhece uma maneira melhor, você também pode usá-la. Qualquer método é bom, desde que produza os resultados corretos.
Regras
- Isso é código-golfe, então a solução mais curta vence.
- Construções que resolvem esse desafio como um todo e construções que calculam a reversão de bits de um valor não são permitidas. Isso não inclui built-in que executam conversão binária ou outras operações bit a bit.
- Sua solução deve ser, no mínimo, válida para n de 0 a 31.
0
vez de [0]
ou precisa ser uma lista?
IntegerReverse[Range[2^#]-1,2,#]&
,. (Eu não sei por que Mathematica precisa que built-in, mas eu acho que não é um estranho muito queSunset
...)