快速提问。我从未有过使用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&amp; x-1)和(x | x-1)+1这样的东西是什么意思?我认为%正在做模数。和%i是一种在C中打印出整数的方法吗?
由于
答案 0 :(得分:4)
&
运算符,如*
运算符 1 可用于两个不同的事情,具体取决于它是否用作二进制或一元运算符。
&
之后的一元&var
获取var
的地址。必须将其传递给scanf
。&
这样的二进制var & var
是一个按位AND,就像第2项一样。
&
的两边都有操作数,那么重要的是什么。因此,& var
仍为一元&
而var &var
仍为二元&
。(x&x-1)
正在与x
和x-1
进行按位AND。(x|x-1)
正在与x
和x-1
进行按位OR。%
表示模数。1 << n
正在向左移位n
数字%i
printf
的第一个参数是格式符号,指定下一个参数为int
,以便printf
可以打印它正确(因为它不知道它本身是什么类型,所以你必须告诉它)。它与模数无关。你可以在这里看到printf
的非常深入的定义:http://pubs.opengroup.org/onlinepubs/9699919799/(谢谢pmg)
%i
在字符串之外,它将在某个其他操作数的左侧,并且是平均模数。%i
本身并不意味着什么。它只对printf
有意义,因为printf
特别对待它。它会搜索它为%format
出现的字符串(其中format
是格式,而不是单词“format”)并根据遇到的格式执行某些操作。 1 *
运算符也有两个不同的版本:一元版本和二进制版本。一元版本表示指针间接,二进制版本表示乘法。
答案 1 :(得分:2)
(x&amp; x-1)和(x | x-1)+1的含义是什么意思?
(x&x-1)
相当于(x & (x-1))
。 &
是按位AND 运算符。类似地,对于第二个示例,|
是按位OR 运算符。
我认为%正在模数。
和%i是一种在C中打印出整数的方法吗?
答案 2 :(得分:2)
|
是bitwise OR。&
是bitwise AND。<<
是bitwise shift。%
是模数。%i
格式字符串打印整数。答案 3 :(得分:1)
printf
是格式化的输出函数,其中%i
表示参数是整数。例如,可以使用更多信息here。
%
运算符确实是模数。 &
是按位AND,|
是按位OR。
答案 4 :(得分:1)
该行:
for (x=1; x < (1 << n); x++)
将x初始化为1并重复/迭代直到x <1。 (1左移n)。左移基本上移动了1个左n个二进制空间的二进制表示。因此,在左移1后,0001将为0010 - 这类似于乘以2 ^ n。然后x增加1(x ++)。最终,x的增加最终会导致循环终止,因为x 说“值x的剩余部分(二进制和)值x-1除以3.因此,如果x是4,我们使用的是4位数(愚蠢,我知道 - 但它显示了这一点) : 下一个声明: 表示x(二进制或)x-1,其中1加到该值。整个总和有3个修改,再次将其跳过3并取余数,所以如果x再次为4并且我们使用的是4位整数: printf允许格式化打印出可变长度的参数列表,这些参数可以是表达式,因此它将打印出来: 用我们的答案替换%i。 (x&x-1)%3
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
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.
move from tower 0 to tower 1 <new line>
答案 5 :(得分:1)
&
和|
是按位运算符(分别是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))
答案 6 :(得分:0)