c++ - 表达式 "b=(b-x)&x"是什么意思?

标签 c++ loops set bit-manipulation

鉴于 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

最佳答案

首先是简单的部分:

Does the loop terminate when the value of (b-x)&x becomes zero? I'm familiar with == but not with = being here in the do while loop. How does that work?


是的。
一个 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 , bc到 0。这相当于 a = (b = (c = 0)); ,即它设置 c为 0,然后设置 b到那个结果,然后它设置 a到那个结果。 (在 C++ 中,可以编写一个不遵循此规则的类,但我们在这里只处理 int s,而不是类)
    有些人喜欢使用这个技巧来缩短他们的代码。你可以这样写:
    do{
        cout << b<<"\n";
        b = (b-x)&x;
    }while(b);
    

    What does the expression b=(b-x)&x mean?

    =是赋值。 -是减法。 &是“按位与”。
    这减去 x来自 b .然后,它将答案与 x 进行按位与运算.然后,它设置 b到那个答案。
    什么是按位与?按位 AND 是一种运算,您将数字以二进制形式记下,将它们排列起来,然后创建一个新数字,如果两个输入中的位均为 1,则每一位为 1,否则为 0。例子:
        01011010 = 90
      & 11101000 = 232
      -----------------
        01001000 = 72
    
    所以 90 和 232 是 72。

    How does it work?


    该程序基本上将数字视为二进制。 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...
    
    你可以肯定,发明这个技巧的人非常聪明。

    关于c++ - 表达式 "b=(b-x)&x"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62716542/

    相关文章:

    java 。如何使用 forEach 检查元素是否已成功添加到集合和跟踪索引中?

    python - 如何优雅地使用 Python 迭代器

    java - 增加 HashMap 中的单个值

    python - 有没有办法为 random.uniform 设置开放和封闭端点?

    c++ - 如何仅将 C 预处理器应用于某些 (#if/#endif) 指令?

    c++ - 崩溃 : terminate called after throwing an instance of 'std::system_error' what(): Resource deadlock avoided

    c++ - 从 OpenCV FileNodeIterator 保存/读取矩阵

    c++ - 保存累加器的每次迭代?

    c++ - 你如何找到集合中元素的总和?

    c++ - 来自标准库调用的结构化异常 (SE)