在我搜索软件锁相环的示例时,我遇到了以下问题
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);}
答案 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|