先解决简单的问题:
当 (b-x)&x 的值变为零时,循环结束吗?我熟悉 == 运算符,但不知道 = 在 do while 循环中的作用。这是如何工作的?
是的。
像这样的 do
/while
循环:
do{
cout << b<<"\n";
}while(b = (b-x)&x);
以下步骤:
- 执行
cout << b<<"\n";
。
- 执行
b = (b-x)&x
并记住结果。
- 如果结果不为零,则返回第1步。
=
是赋值运算符。它将一个变量设置为一个值,例如
i = 0;
。但是...赋值的
结果是什么?在C语言中,赋值的结果是被赋值的值。这使得您可以编写
a = b = c = 0;
,以将三个变量
a
、
b
和
c
设置为0。这相当于
a = (b = (c = 0));
,即它将
c
设置为0,然后将
b
设置为该结果,最后将
a
设置为该结果。(在C++中,可能会编写一个不遵循这个规则的类,但我们只处理
int
类型,而不是类)
有些人喜欢使用这个技巧使他们的代码更短。相反,您也可以像下面这样编写它:
do{
cout << b<<"\n";
b = (b-x)&x;
}while(b);
表达式b=(b-x)&x是什么意思?
“=”代表赋值,“-”代表减法,“&”代表二进制“与”运算。
这个表达式从b中减去x,然后对结果进行位“与”运算,并将答案赋给b。
什么是二进制“与”运算?二进制“与”运算是指将两个数字按位对齐,对每个对应的位执行逻辑“与”操作,生成一个新的数字。如果两个输入中的位都是1,则相应位为1,否则为0。例如:
01011010 = 90
& 11101000 = 232
-----------------
01001000 = 72
所以,90和232是72。
它是如何工作的?
该程序基本上将数字视为二进制。在x
中,每个比特位都是1表示“在集合中”,或者是0表示“不在集合中”。
b
然后通过所有可能的比特组合。 b = (b-x) & x;
是一种“巫术魔法”,用于按顺序将组合更改为下一个组合,例如:
- 000000000 <- b the first time
011001001 <- x
100110111 <- b-x
& 011001001 <- x
000000001 <- (b-x)&x (b the second time)
- 011001001 <- x
100111000 <- b-x
& 011001001 <- x
000001000 <- (b-x)&x (b the third time)
- 011001001 <- x
100111111 <- b-x
& 011001001 <- x
000001001 <- (b-x)&x (b the fourth time)
...etc...
你可以肯定,发明这个技巧的人非常聪明。
x
到底是什么?它的类型是什么?它在哪里声明?它的初始值是多少?在循环体中它如何变化? - Bathsheba*this
"_。这意味着b = a
是一个操作(其中int b; int a;
),它返回对b
的引用。 - Thomas Sablik