這篇算是複習三個常見的邏輯知識:
常見的邏輯匣有三個:And, or和not,它們有各自的圖形,像Android娃娃頭上的形狀就是And匣。
除了and, or, not之外,還有一種叫「互斥匣」,它搭配著And,Or和not之後,就會產生另外四種邏輯匣:XAND, XOR, XNAND, XNOR。雖然做軟體的不太管「匣」這件事情,但邏輯上還是相通的,但在軟體開發時比較常用的只有And, OR, NOT以及接下來要說的XOR。
(不是其他的不存在,可以透過其他方法來實做相關的匣)
什麼是XOR?為什麼他特別到很多語言都願意把他納入位元運算裡呢?
它的輸出是
XOR具備什麼特性?假設有個需求,是要挑出住在台北,但出生地不在台北,或者出生地是台北,但目前不住在台北的人。原本它的條件應該是
((user.BirthPlace == TAIPEI && user.Address != TAIPEI) || (user.BirthPlace != TAIPEI && user.Address == TAIPEI))
但透過XOR的真值表可以發現,當輸入值同時為true或同時為false時,輸出會是false,所以這個可以簡單的寫成:
(user.BirthPlace == TAIPEI ^ user.Address == TAIPEI)
XOR大多數的使用場景都是在位元運算,特別是加密、備份、或考試的時候會用到,不過有些場景還是很適合使用。
如果常搞不清楚條件裡是否要包含某些條件,真值表(Truth Table)和文氏圖(Venn Diagrams)是你的好朋友。
真值表是用來列出所有可能條件的大表,使用時把輸入的條件,以及運算的結果列出來。
以上面的例子:要挑出住在台北,但出生地不在台北,或者出生地是台北,但目前不住在台北的人,真值表的長相就是:
P | Q | P^Q |
---|---|---|
T | T | F |
T | F | T |
F | T | T |
F | F | F |
而文氏圖,則是用圖像化的方式顯示應該包含的結果,以上面的例子來看,XOR的文氏圖就是 | ||
為什麼真值表跟文氏圖對工程師那麼重要呢?因為它是確認需求非常方便的一項工具,如果條件開始複雜起來,就應該用這些工具建立測試案例,並和專案經理確認條件是否正確。 |
在討論if的用法時曾提到if因為太方便而常常導致濫用,但有時候還是免不了需要對付一些很複雜的條件:很多&&,||,!甚至還有許多的括號。
狄摩根定律就是用在處理這方面的問題,那什麼是De Morgan's laws呢?
A && B == !A || !B
...感覺變得更複雜了,那裡方便了?
這就要回到更前一天的[副詞] Not,你的變數被旋轉了嗎?,例如如果我想買一台Phash Speed 5
我的條件是:
if(!(I.HaveMoney && PS5.IsAvaliable && Wife.AllowsMeToGetOne))
BuyAPlashSpeedFive();
邏輯上說得通,但語意上因為那個不起眼的驚嘆號而整個反轉,而且有很多層的括號,因此改寫成:
if(!I.HaveMoney || !PS5.IsAvaliable || !Wife.AllowsMeToGetOne)
BuyAPlashSpeedFive();
閱讀上就更容易理解了。
以上就是三個我認為軟體工程師:只要是軟體工程師,都應該要知道的三個邏輯方面的小常識,有些可能在計算機概論上過,有些可能在一些文件裡看過。可能不常用但建議還是多研究看看,很有幫助喔!
XOR gate
Truth Table
Venn Diagrams
De Morgan's Laws