[我发现许多人使用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;
}
注:此答案(与方法本身一样)假定有符号整数以two's complement形式表示。
表达式x & -x
是一种快速的方法-但公认的奥秘-获取由x
中的[[最低设置位表示的值的方式(当所有其他位都清除时)。有时称为位的[[weight,在数值上等于2增大到位的位置的幂(其中最低有效位是位置0
)。
x
和-x
的二进制(2s-comp)表示形式中设置一个单个位
]--这实际上是是x
中的最低有效设置位。Quora上有很多示例,说明了它是如何工作的。