如何阅读此软件锁相环代码?

时间:2014-05-22 09:56:09

标签: c

在我搜索软件锁相环的示例时,我遇到了以下问题

Software Phase Locked Loop example code needed

Adam Davis 的回答中,给出了一个被破坏的网站,我尝试了评论中提供的新链接,但我无法使其工作。

Kragen Javier Sitaker 的答案给出了以下代码作为软件锁相环的简单示例。

main(a,b){for(;;)a+=((b+=16+a/1024)&256?1:-1)*getchar()-a/512,putchar(b);}

他的回答中还包括一个链接,该链接应该是一个更具可读性的例子,但这个链接也被打破了。因此,我一直在尝试将上述代码转换为更简单,更易读的代码。

我到目前为止:

main(a,b){
    for(;;){
    // here I need to break up the code somehow into a if() statement('s).
       if(here I get lost){
          a = a+1;
          if(here i get lost some more){
           b = b+1;
          }
       }
}

感谢SO问题What does y -= m < 3 mean?

我知道可以将a+=b+=分解为if语句。 但是代码中的(&256? 1 : -1)*getchar()-a/512,putchar(b);部分正在扼杀我。我一直在Google和SO上查看所使用的符号和函数的含义。

我知道&amp; 符号表示内存中的地址。

我知道符号声明了一个位字段,或者可以与作为条件运算符的符号结合使用。我可以使用两者的组合,如what does the colon do in c?

中的 sirgeorge 回答

Theory Behind getchar() and putchar() Functions

我知道getchar()会读取一个字符

我知道putchar()会显示字符

但是示例代码中所有这些的组合对我来说是不可读的。即使我知道他们分别做了什么,我也无法让自己感觉可读。

所以我的问题:如何阅读此软件锁相环代码?

main(a,b){for(;;)a+=((b+=16+a/1024)&256?1:-1)*getchar()-a/512,putchar(b);}

1 个答案:

答案 0 :(得分:1)

我得到的是:

main (a, b)
{
    char c;
    for (;;)
    {
        c = getchar();
        b = (b + 16 + (a / 1024));
        if(!(b & 256)) 
        {
            c = c * -1;
        }
        a = a + c - (a/512);
        putchar(b);
    }
}

我必须添加c变量才能迷路。

该计划的作用:

Take a and b.
Infinite loop:
    get a char input in c
    calculate b
    If (b bitwise AND 256)
        c = -c
    Calculate a
    Print b

似乎它将输入转换为其他内容,我必须看到行动中的代码以便更好地理解我自己。

希望它有所帮助!

提示:

https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

a+= =&gt; a = a +

a?b:c =&gt; if(a){return b;} else {return c;}(作为一个功能本身,它不会真正回归)

添加括号,有帮助。

a & b是按位AND:

a/b |0|1|
   0|0|0|
   1|0|1|