理解for循环增量部分

Understanding for-loop increment part

本文关键字:量部 循环 for 理解      更新时间:2023-10-16

谁能告诉我这在for循环中是什么意思?我在什么地方见过,但不懂。

for (int i = p; i >= 0; i = ((i + 1) & i) - 1){
  //DO SOMETHING
  }

我想问一下这个I = ((I + 1) &I) - 1。这里的减量是怎么进行的?我搞不懂

与此类似,我又面临了一个问题:

  for (int i = p; i < 5; i = (i + 1) | i){
  //DO SOMETHING
  }

这里i = (i + 1) | i是什么意思?请explainc + +

下面的代码是Java的,但是类似的行为可以在c++, C

仔细观察第一个循环

int p = 29; // 30th element if zero indexed
for (int i = p; i >= 0; i = ((i + 1) & i) - 1) {
    System.out.println(Integer.toString(i + 1, 2) + " : " + (i + 1));
}
输出:

11110 : 30          -> 30th element    30 -> 16 + 8 + 4 + 2
11100 : 28          -> 28th element    28 -> 16 + 8 + 4
11000 : 24          -> 24th element    24 -> 16 + 8
10000 : 16          -> 16th element

观察位模式

同样对于第二个循环

int p = 2; // 3rd element if zero indexed
for (int i = p; i < 100; i = (i + 1) | i) {
    System.out.println(Integer.toString(i + 1, 2) + " : " + (i + 1));
}
输出:

11 : 3          -> 3rd element
100 : 4         -> 4th element
1000 : 8        -> 8th element
10000 : 16      -> 16th element
100000 : 32     -> 32nd element
1000000 : 64    -> 64th element

再次观察位模式。

我唯一看到这样的位模式的地方是在构建依赖树时,如Fenwick树或位索引树。

检查:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=binaryIndexedTrees

在链接中我猜他们假设是1索引但这里是0索引因此我调整了元素的位置

[Edit]

下面的逻辑恰好在一种情况下工作,但不是所有情况。这个答案是不完整的,因为有相当多的额外信息出来了…

,是位与运算(与&&相反)这是一个逻辑与)。逻辑如下:

 0110 (6)
+0001 (1)
=0111 (7)
&0110 (6)
=0110 (6)
-0001 (1)
=0101 (5)

基本上,它是一堆附加的逻辑,让你在减去1之前回到你开始的地方;)

您应该能够对第二个问题遵循相同的逻辑(|是位或)。