【问题标题】:How to simplify logical operation in C如何简化C中的逻辑运算
【发布时间】:2019-12-25 04:05:24
【问题描述】:

我有以下逻辑需要简化以看起来更清晰和简洁:

 if (x1 < y1)
    return 1;
 else if (x1 == y1)) {
     if (x2 < y2)
         return 1;
     else if (x2 == y2) {
         if (x3 < y3)
             return 1;
     } else 
         return 0;
     }
 } else
    return 0;

为了解决上述问题,我应用了逻辑表达式来进一步简化这几行条件:

if (x1 < y1 || (x1 == y1 && x2 < y2) || (x1 == y1 && x2 == y2 && x3 < y3))
    return 1;
else
    return 0;

我不确定如何从这里进一步简化。谁能帮帮我?

更新: For further simplifying, I tried applying boolean algebra to this expression,但没有运气!我想出了这个:

A + (A1 * B) + (A1 * B1 * C)

其中A 表示x1 &lt; y1A1 表示x1 == y2

【问题讨论】:

  • 您是想简化它以使其更清晰、更简洁,还是处于需要大量优化的紧密循环中?如果是第二个并且您的值范围有限,您可以通过一些转变和一次比较来做到这一点。但必须有非常具体的理由才能使之成为正确的方法。
  • 我相信问题属于这里:codereview.stackexchange.com
  • x1 &lt; y1 || (x1 == y1 &amp;&amp; (x2 &lt; y2 || (x2 == y2 &amp;&amp; x3 &lt; y3)))
  • 我正在尝试简化它以使其更清晰、更简洁。在这种情况下,性能并不重要,可读性才是。如果位移使它看起来可读 - 就这样吧。

标签: conditional-statements logical-operators boolean-algebra


【解决方案1】:

IMO 在 C 中执行这种链式关系的最简洁方法是使用 ?:

return x1 == y1 ? x2 == y2 ? x3 < y3 : x2 < y2 : x1 < y1;

如问题 cmets 中所述,如果您真的关心性能,并且值的范围有限,则可以使用 bit twiddling 将它们组合成一个值进行比较。如果字段都是 uint16_t(无符号 16 位值),例如,您可以这样做:

uint64_t x = ((uint64_t)x1 << 32) + ((uint64_t)x2 << 16) + x3;
uint64_t y = ((uint64_t)y1 << 32) + ((uint64_t)y2 << 16) + y3;
return x < y;

但这可能不太清楚,可能是过早的优化。

【讨论】:

  • 我相信这更具可读性:return x1 != y1 ? x1 &lt; y1 : (x2 != y2 ? x2 &lt; y2 : x3 &lt; y3); 因为x1 != y1x1 &lt; y1 很接近,x2、y2 也是如此。它还立即处理短分支。
  • @dyukha:合理,尽管您可能应该删除使其不太清晰的多余括号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 2012-09-02
  • 2011-06-25
  • 1970-01-01
  • 2018-05-12
  • 2014-07-07
  • 1970-01-01
相关资源
最近更新 更多