有人可以说出这对于循环意味着什么。我曾在某处看到它但却无法理解它。
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)|我的意思是? 请解释++
答案 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索引,因此我调整元素的位置