【问题标题】:Understanding for the use of the & Bitwise Operator理解 & 位运算符的使用
【发布时间】:2014-03-06 15:30:41
【问题描述】:

我一直在分析代码并试图理解算法的每个部分。 我遇到了使用按位和运算符的部分

if (qpd >= 0) qpd += qpd&1;
else qpd -= qpd&1;

据我了解,该算法希望使用 1 作为变量 qpd 的掩码,但由于数字仅为 1,因此执行几乎不进行任何更改的操作没有多大意义。由于我迷路了,请在这里赐教。

使用按位运算符从数组中获取数据的幅度和频率的for循环如下:

/* this is the analysis step */
            for (k = 0; k <= fftFrameSize2; k++) {

                /* de-interlace FFT buffer */
                real = gFFTworksp[2*k];
                imag = gFFTworksp[2*k+1];

                /* compute magnitude and phase */
                magn = 2.*sqrt(real*real + imag*imag);
                phase = atan2(imag,real);

                /* compute phase difference */
                tmp = phase - gLastPhase[k];
                gLastPhase[k] = phase;

                /* subtract expected phase difference */
                tmp -= (double)k*expct;

                /* map delta phase into +/- Pi interval */
                qpd = tmp/M_PI;
                if (qpd >= 0) qpd += qpd&1;
                else qpd -= qpd&1;
                tmp -= M_PI*(double)qpd;

                /* get deviation from bin frequency from the +/- Pi interval */
                tmp = osamp*tmp/(2.*M_PI);

                /* compute the k-th partials' true frequency */
                tmp = (double)k*freqPerBin + tmp*freqPerBin;

                /* store magnitude and true frequency in analysis arrays */
                gAnaMagn[k] = magn;
                gAnaFreq[k] = tmp;

            }

【问题讨论】:

  • “几乎没有做任何改变”是没有意义的。在某些情况下,它确实会做出改变。它没有什么虚拟的。
  • 哦,对不起,马特!我的意思是没有做任何改变,当我从对 & 位运算符的理解中阅读它时,它似乎没有做任何改变。终于从下面的答案中理解了。 :)

标签: c++ signal-processing


【解决方案1】:

该代码用于将数字四舍五入到下一个偶数;向上舍入正数和向下舍入负数:例如

7 becomes 8
12 remains 12
-7 becomes -8

它通过添加或减去值的最后一位来工作,奇数为 1,偶数为 0。

【讨论】:

  • 谢谢6402!我非常感谢您的帮助!我从来不知道 & 可以这样使用。非常感谢!
  • @user3160974:是 6502,不是 6402!!!我不知道 6402 是什么... 6502 是我使用的第一个 micro 的名称(8 位,Apple ][)。
  • 哦对不起6502!!!那个错字真是太粗心了!我深表歉意。再次感谢你的帮助! :)
【解决方案2】:

好吧,我不完全确定所有这些作为一个整体在做什么,但所有 &amp; 运算符所做的基本上是加一或零,如果 qbd 大于或等于零,或者减一如果小于零,则为零(全部基于第一位)。

不确定这是否是您要查找的内容。

【讨论】:

  • 谢谢乔希!是的,这就是我一直在寻找的答案。我对 & 位运算符的理解感到困惑,现在我的理解已经澄清了。 :)
猜你喜欢
  • 2019-12-14
  • 2022-05-19
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 2020-12-12
  • 2010-11-03
  • 1970-01-01
相关资源
最近更新 更多