减少,异或运算符 (--) 在 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-&gt;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-&gt;degree != 0 then //.. 之后?

以上是关于减少,异或运算符 (--) 在 if 和 for 语句上的主要内容,如果未能解决你的问题,请参考以下文章

位运算 异或51nod区间xor

算数运算符

异或运算符^

算法和流程控制 --《高性能JavaScript》

LeetCode 1486 数组异或操作[位运算 数学] HERODING的LeetCode之路

布尔逻辑运算符