[英]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 測試中,您使用了a
和b
值的特定組合,結果匹配,但這並不意味着表達式是等效的——事實上它們不是。 一種快速說服自己的方法是檢查組合
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.