表达式"b=(b-x)&x"是什么意思?
What does the expression "b=(b-x)&x" mean?
给定 x 是一个集合,下面的代码遍历集合 x 的子集:
int b = 0;
do {
// process subset b
} while (b=(b-x)&x);
我读到这篇关于位操作以及它如何用于表示集合的读物。
表达式b=(b-x(&x是什么意思? 它是如何工作的? 我熟悉==但不熟悉=在 do while 循环中。这是怎么回事?当 (b-x(&x 的值变为零时,循环会终止吗?
代码的用法如下:
#include <iostream>
using namespace std;
void subsets(int x, int b){
do{
cout << b<<"n";
}while(b = (b-x)&x);
}
int main()
{
int x = (1<<1)|(1<<3)|(1<<4)|(1<<8);
int b = 0;
subsets(x, b);
return 0;
}
上面代码给出的输出是:
0
2
8
10
16
18
24
26
256
258
264
266
272
274
280
282
首先是简单的部分:
当 (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 是什么意思?
=
是分配。-
是减法。&
是"按位 AND"。
这会从b
中减去x
。然后,它按位与x
一起给出答案。然后,它b
找到答案。
什么是按位 AND?按位 AND 是一种操作,您可以在其中以二进制形式记下数字,将它们排列起来,然后创建一个新数字,如果两个输入中的位均为 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...
你可以肯定,发明这个把戏的人非常聪明。
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 线应该是什么意思
- "CID"在AT+HTTPPARA= "CID" ,1中是什么意思
- 表达式"b=(b-x)&x"是什么意思?
- 这个表达是什么意思?
- 此代码验证公式是什么意思?
- 跟踪日志中的T.11803()是什么意思?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- * 和 ** 在 C++ 函数声明中是什么意思?
- _T("xyz")是什么意思?
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 这行代码到底是什么意思?
- 在命名空间名称之前加上 :: 是什么意思?
- 从字符数组的元素中减去'a'是什么意思
- "friend"关键字在C++中是什么意思?
- 减法中的"0"是什么意思?
- 字符数组前面的加号是什么意思?
- 这里的字符串函数是什么意思