繁体   English   中英

理解一些C代码

[英]understanding some C code

快问。 我从未有过C的经历。

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int n, x;
   printf( "How many disks? " );
   scanf( "%d", &n );
   printf("\n");
   for (x=1; x < (1 << n); x++)
      printf( "move from tower %i to tower %i.\n",(x&x-1)%3, ((x|x-1)+1)%3 );
    return 0;
}

这是河内的迭代塔。 (x&x-1)和(x | x-1)+1的含义是什么意思? 我认为%正在做模数。 和%i是一种在C中打印出整数的方法吗?

谢谢

  1. &运算符,与*运算符1一样,可以用于两种不同的事情,具体取决于它是用作二元 运算符还是一元运算符。
    1. 一元&喜欢&var需要的地址var 这是将其传递给scanf所必需的。
    2. Binary & like var & var是一个按位AND,就像第2项一样。
      • 请注意,间距无关紧要。 重要的是,如果&两侧都有操作数。 所以& var仍然是一元的&var &var仍然是二元&
  2. (x&x-1)xx-1进行按位AND运算。
  3. (x|x-1)xx-1进行按位OR运算。
  4. %表示模数。
  5. 1 << n正在向左移动1到左数n
  6. 你看到的%i作为printf的第一个参数是格式符号,指定下一个参数是一个int ,这样printf就可以正确打印它(因为它不知道它本身是什么类型,所以你有告诉它)。 它与模数无关。 你可以在这里看到一个非常深入的printf定义: http ://pubs.opengroup.org/onlinepubs/9699919799/(谢谢pmg)
    • 如果%i在字符串之外,则它将位于某个其他操作数的左侧,并且是平均模数。
    • 字符串中的%i本身并不意味着什么。 它只对printf因为printf特别对待它。 它搜索它获取的字符串是否出现%formatformat是格式,而不是单词“格式”),并根据遇到的格式执行某些操作。

1 *运算符还有两个不同的版本:一元版本和二进制版本。 一元版本表示指针间接,二进制版本表示乘法。

(x&x-1)和(x | x-1)+1的含义是什么意思?

(x&x-1)相当于(x & (x-1)) &按位AND运算符。 类似地,对于第二个例子,其中| 按位OR运算符。

我认为%正在做模数。

是的

和%i是一种在C中打印出整数的方法吗?

是的

printf是格式化的输出函数,其中%i表示参数是整数。 例如, 这里可以获得更多信息。

%运算符确实是模数。 &是按位AND,和| 是按位OR。

这条线:

for (x=1; x < (1 << n); x++)

将x初始化为1并重复/迭代直到x <(1左移n)。 左移基本上移动了1个左n个二进制空间的二进制表示。 因此,在左移1后,0001将为0010 - 这类似于乘以2 ^ n。 然后x增加1(x ++)。 最终,x的增加最终会导致循环因x <(1 << n)条件而终止。

(x&x-1)%3

说“值的剩余部分x(二进制和)值x-1除以3.因此,如果x是4,我们使用的是4位数字(愚蠢,我知道 - 但它显示了这一点):

0100 &
0011
_______
0000        (binary and means both spots being added are 1, none are here).

= 0
0/3 = 0 R 0 - no remainder here, so print 0.

下一个声明:

(x|x-1)+1)%3

表示x(二进制或)x-1,其中1加到该值。 整个总和由3修改,再次将其跳过3并取余数,所以如果x再次为4并且我们使用4位整数:

0100 |
0011
_______
0111    (Binary or means either binary number has a 1 in that slot).

= 4 + 2 + 1 = 7 --> 7 mod 3 = 7 / 3 --> 2 R 1, print  remainder of 1 here.

printf允许格式化打印出可变长度的参数列表,这些参数可以是表达式,所以这里它将打印:

move from tower 0 to tower 1 <new line>

用我们的答案替换%i。

&| 是按位运算符(分别是AND和OR运算符)。

  0101 (decimal 5)
& 0011 (decimal 3)
------
= 0001 (decimal 1)


  0101 (decimal 5)
| 0011 (decimal 3)
------
= 0111 (decimal 7)

由于减法运算符的优先级高于按位运算符的优先级:

(x&x-1) = (x&(x-1)) 
(x|x-1) = (x|(x-1))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM