减少,异或运算符 (--) 在 if 和 for 语句上
Posted
技术标签:
【中文标题】减少,异或运算符 (--) 在 if 和 for 语句上【英文标题】:decrease, XOR operator (--) on if and for statement 【发布时间】:2012-08-24 00:15:28 【问题描述】:我是一个试图从 C++ 代码中理解算法的新手,之后我想在 java 中实现它,但我发现理解代码有困难,这里有 3 段代码让我感到困惑
inline Edge *Node::NextEdge( Edge *prev)
for (int i = 0; i < 4; i++)
prev = (Edge *) ( (int) prev ^ (int) edge[i] );
return prev;
//_____________ em>_______________________________________
if (nextfrag)
if ( --nextfrag->degree)
new_frag( nextfrag, fragnum, len, edge );
//_____________ em>____________________________________
for (pedge = edge; pedge->parent; pedge = pedge->parent);
我对第一个代码的问题:迭代如何在按位异或运算中工作? prev = (Edge *) ( (int) prev ^ (int) edge[i] );
是什么意思? return prev
的值是多少?
第二个代码的问题:减少运算符if ( --nextfrag->degree)
如何在 if 语句中工作?
第三个代码:有没有其他方法可以编写该 for 语句?请向我解释一下 for 语句的意思,因为作为一个新手,我只是习惯于 i= 0;我=某事;我++
对不起,愚蠢的问题,但你的解释会对我有很大帮助,在此先感谢:)
【问题讨论】:
3:Edge pedge = new Edge(edge); while(pedge.getParent() != null) /*...*/ pedge = pedge.getParent();
1 将指针转换为 int,执行异或并将结果转换回指针。如果我没记错的话,这在 64 位系统上可能会失败。
@zapl 但不知何故,我读到在这种情况下 Xor 的实现并不意味着将对象转换为 int,它是关于“如果两个对象不同则返回 1”,就是这样为什么我很困惑
在我看来它不是将对象而是将该对象的指针/内存地址转换为 int。但请注意,我的 C 技能很差 :)
您使用的是指针,但将问题标记为“Java”?
【参考方案1】:
prev = (Edge *) ( (int) prev ^ (int) edge[i] )
(Edge *) 将结果转换为指向 Edge 对象(或结构)的指针
( (int) prev ^ (int) edge[i] )
表达式将指针“prev”(一个 Edge)转换为一个 int 并与数组元素 edge[i] 进行异或(不确定类型,因为此变量超出范围 - 但假设它是一个指向边缘的指针)。指针(地址)大小为 int。不确定算法是什么,但似乎假设这将导致一个新的有效指针地址指向另一个 Edge 用于下一次迭代。
--nextfrag->degree
在这种情况下,递减 nextfrag 指向的 degree 成员,它是指向具有 'degree' 成员的结构的指针。
for (pedge = edge; pedge->parent; pedge = pedge->parent);
这将遍历链表,直到 pedge->parent == 0(链表中的头节点)
此代码非常依赖于打包在字边界上的结构。 指针(地址)是 32 位或 64 位的,因此这是非常糟糕的代码,除非您绝对确定它将在其上运行的目标计算机,因为如果不明确打包您的结构,它可能会导致 32 位或 64 位计算机之间的不同结果。请参阅“#pragma pack”。
这并没有使它更容易理解。
【讨论】:
'--nextfrag->degree' 不是递减指针,而是递减'nextfrag' 指向的'degree' 成员。 我可以这样说:if
在减少nextfrag->degree != 0 then //..
之后?以上是关于减少,异或运算符 (--) 在 if 和 for 语句上的主要内容,如果未能解决你的问题,请参考以下文章