c++ - "x += x & (-x)"是什么意思?

标签 c++ bit-manipulation bitwise-operators segment-tree binary-indexed-tree

我发现很多人用x += x & (-x)x -= x & (-x)来解决区间树问题(而实现线段树、二叉索引树等数据结构。

你能解释一下这个等式的含义吗?

例如:

void update(int m, int x) { 
    m++;
    while (m < N) {
        t[m] = t[m] + x;
        m += m & -m;
    }
}

int query(int m) { 
    int result= 0;
    m++;
    while (m > 0) {
        result = result + t[m];
        m -= m & -m;
    }
    return result;
}

最佳答案

Note: This answer (like the method itself) assumes signed integers are represented in two's complement form.

表达式x & -x 是一种快速 - 但不可否认的神秘 - 获取由最低设置位表示的值的方法x(当所有其他位都清除时)。有时这被称为位的权重,在数值上等于2的位位置次方(其中最低有效位是位置0)。

该方法依赖于以下事实:在两个 x< 的二进制 (2s-comp) 表示中只能设置一个单个位/code> 和 -x - 这实际上是 x最低有效设置位。

关于其工作原理,有一些很好的解释,并附有许多示例,请参见 Quora .

在您显示的 updatequery 函数中,在 while 中增加/减少 m 的量因此,code> 循环根据(原始)m 中最低有效设置位的位置加权

请随时要求进一步澄清和/或解释(但我不想复制/粘贴或解释太多我链接的讨论)。

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

相关文章:

javascript - 如何检查是否不使用Javascript按位运算符?

c++ - 来自 boost::multi_array 的二维数组 - 无法编译

c - 固有地基于BitMask设置数组中的值

mysql - SQL按位运算(MySql)

java - 使用按位运算符对密码类进行编码

C - 确定所有偶数位是否都设置为 1

c++ - 我可以在 STL 中禁用异常吗?

c++ - 如何将 boost::log::expressions 格式化程序对象插入流以格式化时间戳

c++ - 与我自己的 C++ 库的链接错误

c - 当我按位移位 1 << 45 时,怎么会得到一个大整数