Votre objectif est de créer une fonction ou un programme pour inverser les bits dans une plage d'entiers étant donné un entier n . En d'autres termes, vous voulez trouver la permutation d'inversion de bits d'une plage de 2 n éléments, indexés zéro. Il s'agit également de la séquence OEIS A030109 . Ce processus est souvent utilisé dans le calcul de transformées de Fourier rapides, comme l'algorithme Cooley-Tukey sur place pour la FFT. Il existe également un défi pour le calcul de la FFT pour les séquences où la longueur est une puissance de 2.
Ce processus vous oblige à parcourir la plage [0, 2 n -1] et à convertir chaque valeur en binaire et inverser les bits de cette valeur. Vous traiterez chaque valeur comme un nombre à n chiffres dans la base 2, ce qui signifie que l'inversion ne se produira que parmi les n derniers bits.
Par exemple, si n = 3, la plage d'entiers est [0, 1, 2, 3, 4, 5, 6, 7]
. Ceux-ci sont
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
où chaque index i est converti en un index j en utilisant l'inversion de bits. Cela signifie que la sortie est [0, 4, 2, 6, 1, 5, 3, 7]
.
Les sorties pour n de 0 à 4 sont
n Bit-Reversed Permutation
0 [0]
1 [0, 1]
2 [0, 2, 1, 3]
3 [0, 4, 2, 6, 1, 5, 3, 7]
Vous avez peut-être remarqué la formation d'un motif. Étant donné n , vous pouvez prendre la séquence précédente pour n -1 et la doubler. Ensuite, concaténez cette liste doublée à la même liste double mais incrémentée d'une unité. Montrer,
[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]
où ⊕
représente la concaténation.
Vous pouvez utiliser l'une des deux méthodes ci-dessus afin de former votre solution. Si vous connaissez un meilleur moyen, vous êtes également libre de l'utiliser. N'importe quelle méthode est correcte tant qu'elle produit les résultats corrects.
Règles
- Il s'agit de code-golf, donc la solution la plus courte l'emporte.
- Les commandes intégrées qui résolvent ce défi dans son ensemble et les commandes intégrées qui calculent l'inversion de bits d'une valeur ne sont pas autorisées. Cela n'inclut pas les commandes intégrées qui effectuent une conversion binaire ou d'autres opérations au niveau du bit.
- Votre solution doit être, au minimum, valable pour n de 0 à 31.
0
place [0]
ou faut-il que ce soit une liste?
IntegerReverse[Range[2^#]-1,2,#]&
. (Je ne sais pas pourquoi Mathematica a besoin de cette fonction intégrée, mais je suppose que ce n'est pas beaucoup plus étrange queSunset
...)