繁体   English   中英

简化 if 条件布尔表达式

[英]Simplify if condition boolean expression

我的代码中有这个if-condition

if (a||a&&!b){
// do some stuff
}

使用我的junit test中的初始值:

boolean a=true, b = true;

正如我后来认识到的,该语句可以简化为:

if (a&&b)

变成绿色: Assert.assertTrue(a||a&&!b == a&&b);

有没有进一步的简化? 我怎么知道这个布尔表达式可以简化?

只需检查真值表(我已添加括号)

  a || (a && (!b))

  a|b|result
  ----------
  T|T|T 
  T|F|T 
  F|T|F 
  F|F|F

正如我们所见,公式不依赖b ,可以简化为仅

  a

最后

  if (a) {
    // do some stuff
  }

对于具有许多变量的公式,当真值表太长而无法手动分析时,您可以使用 Eomm 建议的卡诺图

一种用于简化复杂布尔表达式的常用技术是卡诺图 它相对容易学习,并且可以帮助您生成更短的表达式,甚至可以从真值表构建布尔表达式。

您的表达式的卡诺图非常简单 - 它看起来像这样:

在此处输入图片说明

它简化为a ,而不是a && b

您可以使用卡诺图来简化布尔逻辑。

使用3个或更多变量是最好的方法

a || a && !b 

不等于

a && b

它等于只是a

我想在您的 JUnit 测试中,您使用了ab值的特定组合,结果匹配,但这并不意味着表达式是等效的——事实上它们不是。 一种快速说服自己的方法是检查组合

a = true, b = false;

您的原始表达清楚得到true所有情况下, a == true ,但你的第二个表达式将产生false每当b == false

至于等价的,只是一个形式证明a ,采取扩张

a == a && (b || !b)
  == a && b || a && !b

插入您的原始表达式:

a || a && !b == a && b || a && !b || a && !b
             == a && b || a && !b
             == a

Wolfram Alpha实际上做了布尔代数简化。 它可能需要一点点转换它给你的答案,使它与你的编程语言兼容,但这个概念有效并且检查得很好。 这是该页面的链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM