Javascript 到 Python 在 for 循环的条件和最终表达式中进行位移

Javascript to Python with bitwise shift in a for loop's condition and final-expression

我有一个用javascript写的FFT代码,贴在下面:

function FFT(re, im) {
        var N = re.length;
        for (var i = 0; i < N; i++) {
            for (var j = 0, h = i, k = N; k >>= 1; h >>= 1)
                j = (j << 1) | (h & 1);
            if (j > i) {
                re[j] = [re[i], re[i] = re[j]][0];
                im[j] = [im[i], im[i] = im[j]][0]
            }
        }

        for (var hN = 1; hN * 2 <= N; hN *= 2)
            for (i = 0; i < N; i += hN * 2)
                for (j = i; j < i + hN; j++) {
                    var cos = Math.cos(Math.PI * (j - i) / hN),
                        sin = Math.sin(Math.PI * (j - i) / hN);
                    var tre = re[j + hN] * cos + im[j + hN] * sin,
                        tim = -re[j + hN] * sin + im[j + hN] * cos;
                    re[j + hN] = re[j] - tre;
                    im[j + hN] = im[j] - tim;
                    re[j] += tre;
                    im[j] += tim;
                }
    }

for循环中有一条语句

for (var j = 0, h = i, k = N; k >>= 1; h >>= 1)

我想知道Python中这个for循环怎么写? ks 数组和hs 数组我不是很清楚所以我不知道如何使用zip

一种可能的方法是使用 while 循环:

j = 0
h = i
k = N >> 1
while k > 0:
    ... # current logic in the for loop
    k >>= 1
    h >>= 1

@fileyfood500 介绍了最简单的方法。

另一种方法可能是在生成器中分离出 kh 逻辑,并使用 for 循环:

def gen(k, h):
    while k >> 1:
        yield h
        h >>= 1
        k >>= 1

for i in range(N):
    j = 0
    for h in gen(N, i):
        j = (j << 1) | (h & 1)

如果你这样做,你可以 reduce 循环:

from functools import reduce    # Py3

for i in range(N):
    j = reduce(lambda j, h: (j << 1) | (h & 1), gen(N, i), 0)