了解for循环增量部分

时间:2014-08-09 13:56:51

标签: c++

有人可以说出这对于循环意味着什么。我曾在某处看到它但却无法理解它。

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 + 1)|我的意思是? 请解释++

2 个答案:

答案 0 :(得分:0)

[编辑]

以下逻辑恰好适用于一个案例,但不是所有案例。这个答案并不完整,因为已经出现了一些额外的信息......

&amp;是按位AND(与&amp;&amp;&amp;&amp;逻辑AND)相反。遵循逻辑:

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

所以,基本上,它是一堆额外的逻辑,可以让你在减去一个之前让你回到起点;)

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

答案 1 :(得分:0)

以下代码是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树或Bit Indexed Tree。

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

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