c++ - (number & -number) 在位编程中是什么意思?

标签 c++ bit bitwise-and fenwick-tree

例如:

int get(int i) {
    int res = 0;
    while (i) {
        res = (res + tree[i]) % MOD;
        i -= ( (i) & (-i) );
    }
    return res;
}

树更新函数:

void update(int i, int val) {
    while (i <= m) {
        tree[i] = (tree[i] + val) % MOD;
        i += ( (i) & (-i) );
    }
}

你能解释一下他们在代码中使用 ( (i) & (-i) ) 做了什么吗?

最佳答案

让我假设负值使用二进制补码表示。 在这种情况下,-i 可以计算为 (~i)+1(翻转位,然后加 1)。

例如,让我考虑 i = 44。然后,在二进制中,

i           = 0000 0000 0000 0000 0000 0000 0010 1100
~i          = 1111 1111 1111 1111 1111 1111 1101 0011
-i = (~i)+1 = 1111 1111 1111 1111 1111 1111 1101 0100
(i) & (-i)  = 0000 0000 0000 0000 0000 0000 0000 0100

如您所见,可以使用 (i) & (-i) 计算出最小位 1。

关于c++ - (number & -number) 在位编程中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35861228/

相关文章:

python - 为什么下面代码的输出是这样的

javascript - i & 0xFF 与 i % 256(带负数)

c++ - 在包含 shared_ptr 的 map 上使用 find_if 会增加引用计数

c++随机列表元素不被循环删除

python - 从 C+ 生成 TFRecord 格式数据

c++ - 如何将类的某些 typedef 传递给模板

c - 探索结构包装

byte - 简单的寻呼系统

c++ - 跟踪 boolean 数据

java - 按位运算 Java AND 多个 boolean 值