您的目标是创建一个函数或程序来反转给定整数n的整数范围内的位。换句话说,您想要找到2 n项范围(零索引)的位反转排列。这也是OEIS序列A030109。此过程通常用于计算快速傅立叶变换,例如用于FFT的就地Cooley-Tukey算法。计算长度为2的幂的序列的FFT 也是一个挑战。
此过程要求您迭代[0,2 n -1] 范围,并将每个值转换为二进制值并反转该值中的位。您会将每个值都视为以2为底的n位数字,这意味着反转只会在最后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]
。
从0到4的n输出为
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]
其中⊕
表示串联。
您可以使用上述两种方法中的任何一种来形成您的解决方案。如果您知道更好的方法,则也可以自由使用。只要能输出正确的结果,任何方法都可以。
规则
- 这是代码高尔夫球,因此最短的解决方案是成功的。
- 不允许从整体上解决此难题的内建函数和用于计算值的位反转的内建函数。这不包括执行二进制转换或其他按位运算的内置函数。
- 您的解决方案必须至少对0到31之间的n有效。
0
而不是[0]
列表吗?
IntegerReverse[Range[2^#]-1,2,#]&
。(我不知道为什么 Mathematica需要内置的功能,但我想这并不奇怪Sunset
……)