C语言 在什么情况下会在for循环终止条件下使用位移位操作符?



我一直在看一些使用IFFT(快速反傅立叶变换)创建的样本填充数组的代码。

当作者迭代数组时,他使用一个if结构,如下所示:

int idx;
for (idx = 1; idx < (tableLen >> 1); idx++) {
    freqWaveRe[idx] = 1.0 / idx;                    // sawtooth spectrum
    freqWaveRe[tableLen - idx] = -freqWaveRe[idx];  // mirror
}

你能解释一下终止条件吗?

idx < (tableLen >> 1)

你为什么要做这样的事情,这是什么意思?

此表达式中使用的位移位运算符:

idx < (tableLen >> 1)

在遍历数组的前半部分后终止for循环。右移运算符将值向右移动一位。向右移动一位,除以2。

1010 in binary = 10

右移1位得到:

0101 in binary = 5

还有几件事:

Tony D提到了一些评论,这些评论认为"如果idx是负的,这将不能很好地工作"。负数的表示方式不同。有时负号存储时,第一个位表示符号。如果你向右移动符号,你会丢失这些信息,并造成一些混乱。

Tony D还说:"从历史上看,当移位操作码的执行速度比除法快时,这是一种优化,优化器是不可信的"

最新更新