程式設計師鼓勵師:電腦科學入門-邏輯運算zhuanlan.zhihu.com
我們知道了邏輯運算包括基本運算:邏輯與,邏輯或,邏輯非,還有乙個不那麼基本,但卻比較常用的運算邏輯異或。
大家如果還記得小學學過的四則運算的話,應該知道四則算術運算是有一些運算定律的,
比如加法交換律:
a+b=b+a
加法結合律:
a+(b+c)=a+b+c
乘法交換律:
a*b=b*a
乘法結合律:
a*(b*c)=a*b*c
乘法對加法的分配律:
(a+b)*c=a*c+b*c
邏輯運算跟算術運算類似,也有不少運算定律,我們先來看看交換律。
先看看邏輯與運算(a∧b)的真值表:
再看看(b∧a)的真值表:
發現它們的結果一模一樣,所以我們有邏輯與交換律:
a∧b=b∧a
同樣的,我們也有邏輯或交換律:
a∨b=b∨a
以及邏輯異或交換律:
a⊕b=b⊕a
它們統稱為邏輯運算交換律。
然後我們再看看a∧(b∧c)的真值表:
再看看a∧b∧c的真值表:
可以看出a∧(b∧c)=a∧b∧c
同樣的,也有a∨(b∨c)=a∨b∨c
以及a⊕(b⊕c)=a⊕b⊕c
以上稱為邏輯運算結合律。
然後再看看邏輯與對邏輯或是否滿足分配率:
果然有(a∨b)∧c=(a∧c)∨(b∧c)
同樣的,也有:a∨(b∧c)=(a∨b)∧(a∨c)
以上稱為邏輯運算分配律。
類似的,通過真值表對比,我們還可以得出邏輯運算吸收律:
a∨(a∧b)=a,a∧(a∨b)=a,a∨(¬a∧b)=a∨b,a∧(¬a∨b)=a∧b
其實吸收律不需要真值表也能推導出來,比如a∨(a∧b),在b=1時
a∨(a∧b)=a∨(a∧1)=a∨a=a(通過基本邏輯運算真值表就能得出a∧1=a和a∨a=a)
然後在b=0時有:
a∨(a∧b)=a∨(a∧0)=a∨0=a(通過基本邏輯運算真值表就能得出a∧0=0和a∨0=a)
因為b的取值只能是1或者0,所以始終有a∨(a∧b)=a
其餘幾個吸收律公式也可以用類似的方法推導出來。
此外邏輯運算還滿足反演律:
¬(a∧b)=¬a∨¬b,¬(a∨b)=¬a∧¬b
反演律同樣可以通過真值表推導出來,以¬(a∧b)=¬a∨¬b為例:
通過真值表可以看出,確實有¬(a∧b)=¬a∨¬b
利用這些運算定律,我們可以對複雜的邏輯運算表示式進行化簡,例如下面這個表示式:
((¬c)∧(¬a)∧b)∨((¬c)∧a∧(¬b))∨(c∧(¬a)∧(¬b))∨(c∧a∧b)
這個表示式非常複雜,我們先觀察它的結構,發現它由四部分組成:
① ((¬c)∧(¬a)∧b)
② ((¬c)∧a∧(¬b))
③ (c∧(¬a)∧(¬b))
④ (c∧a∧b)
這四個部分通過邏輯或(∨)連線在一起。通過優先順序分析,我們可以先把多餘的括號去掉,變成:
① (¬c∧¬a∧b)
② (¬c∧a∧¬b)
③ (c∧¬a∧¬b)
④ (c∧a∧b)
因此原表示式化簡為:
(¬c∧¬a∧b)∨(¬c∧a∧¬b)∨(c∧¬a∧¬b)∨(c∧a∧b)
進一步觀察發現①和②都包含¬c,③和④都包含c,先用一次分配律,把¬c和c提取出來:
¬c∧((¬a∧b)∨(a∧¬b))∨(c∧((¬a∧¬b)∨(a∧b)))
這個表示式可以再分為兩個部分:
(一)¬c∧((¬a∧b)∨(a∧¬b))
(二)c∧((¬a∧¬b)∨(a∧b))
先看第(一)部分,結合之前學過的邏輯異或的公式a⊕b = (¬a∧b)∨(¬b∧a)
可以得出(¬a∧b)∨(a∧¬b)=a⊕b
所以第(一)部分可以化簡為:¬c∧(a⊕b)
再看第(二)部分,保持c不變,將(¬a∧¬b)∨(a∧b)中的(¬a∧¬b)看做乙個整體,應用一次分配律變為((¬a∧¬b)∨a)∧((¬a∧¬b)∨b)
前半部分應用吸收律a∨(¬a∧b)=a∨b,以及交換律,有(¬a∧¬b)∨a=¬b∨a
後半部分應用吸收律以及交換律,有(¬a∧¬b)∨b=¬a∨b
所以有(¬a∧¬b)∨(a∧b)=(¬b∨a)∧(¬a∨b)
再對(¬b∨a)∧(¬a∨b)應用反演律(¬(a∨b)=¬a∧¬b),可以變為¬(¬(¬b∨a)∨¬(¬a∨b))
然後對¬(¬b∨a)和¬(¬a∨b)分別應用反演律,可以變為:¬((b∧¬a)∨(a∧¬b))
根據邏輯異或公式,有¬((b∧¬a)∨(a∧¬b))=¬(a⊕b)
所以第(二)部分可以變為c∧¬(a⊕b)
因此原來的整個表示式可以化簡為(¬c∧(a⊕b))∨(c∧¬(a⊕b))
最後把a⊕b看做乙個整體,再次應用異或公式,可以得出
(¬c∧(a⊕b))∨(c∧¬(a⊕b))=c⊕(a⊕b)=c⊕a⊕b
所以最初的表示式化簡後的最終結果是c⊕a⊕b
邏輯運算定律對真值表反推邏輯表示式非常有用。當然在真實的數位電路設計中,已經沒人會真的再去根據真值表來反推邏輯表示式,這些工作都由計算機軟體來完成了。包括邏輯表示式的化簡,也可以由計算機軟體自動完成。雖然實際工作中已經用不上邏輯表示式化簡這種技能了,但是了解邏輯運算定律,以及定律如何應用,對於理解計算機系統組成和數位電路的工作原理還是很有意義的。比如cpu核心單元「全加器」的設計實現,就需要經歷真值表反推邏輯表示式再化簡的這個過程。雖然全加器作為cpu的基礎部件,現在已經不需要再重新設計實現,但是與全加器相關的電腦科學知識還是需要傳承下去。
好了,今天就介紹這些,我們下次再見!
邏輯運算 位運算
今天有人問我,邏輯運算是什麼,現在來解釋一下 邏輯運算就是相當於資訊競賽基礎工具中的一位的位運算 符號對應關係 wedge cap 交 and 與運算 vee cup 並 or 或運算 neg not 非 xor 異或運算 x k 將x的二進位制右移k位 如 x 10110 2 時,k 1,那麼x ...
邏輯位運算與邏輯運算
兩者非常容易混淆,其實這是截然不同的兩種運算.1.邏輯位運算 與運算 1 2 0 0000 0001 0000 0010 0000 0000 0 或運算 1 2 3 0000 0001 0000 0010 0000 0011 3 按位求反 運算,異或 運算略.移位 左移,右移 運算略.2.邏輯運算 ...
C 邏輯運算 位運算
c gossip 邏輯運算 位運算 一 邏輯運算 在邏輯上有所謂的 且 或 與 反 運算,在c 中也提供這幾個基本邏輯運算所需的 邏輯運算子 logical operator 分別為 且 或 及 反相 三個運算子。來看看下面這個程式會輸出什麼?int num 75 cout num 70 num 8...