簡體   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