理解for循环增量部分
Understanding for-loop increment part
谁能告诉我这在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之前回到你开始的地方;)
您应该能够对第二个问题遵循相同的逻辑(|是位或)。
相关文章:
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 为什么我的for循环不能正确获取argv
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- while循环中while循环的时间复杂度是多少
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 为什么在这个代码结束循环中没有得到结束
- 根据特定的用户输入量结束 while 循环
- 有没有办法在C++中将偏移量设置为基于范围的 for 循环?
- C++ 将部分数组(在某些偏移量)转换为其他类型
- 模量的重复循环
- Vector迭代器+偏移量超出范围,在while循环结束时给出错误