1.4 逻辑运算
比特的一种用法是表示“冷吗?”或“你喜欢我的帽子吗?”等答案为是/否的问题的答案。我们用true表示是,用false表示否,像“哪里有狗狗派对?”这样的问题不能用是/否来回答,因此不能用比特来表示。
在人类语言中,我们经常把几个是/否分句组合成一个句子。我们可能会说,“天冷了要穿上外套,下雨了要穿上外套”或者“下雪了要去滑雪,不上学的时候要去滑雪”。另一种说法可能是“如果天冷或下雨是真的,那么穿外套是真的”和“如果下雪是真的或上学不是真的,那么滑雪是真的”。这些都是逻辑运算,每个运算都会根据其他比特的内容产生一个新的比特结果。
1.4.1 布尔代数
正如代数是一组对数字进行运算的规则,由英国数学家George Boole在19世纪提出的布尔代数,是一组对比特进行运算的规则。与普通代数一样,结合律、交换律和分配律也适用于布尔代数。
有三个基本的布尔运算——NOT(非)、AND(与)和OR(或),以及一个复合运算——XOR(异或)(为“exclusive-or”的简称),四个布尔运算描述如下:
NOT:NOT运算表示“取反”。例如,如果一个比特是假的,对该比特进行NOT运算,结果为真。如果一个比特是真,那么对该比特进行NOT运算,结果为假。
AND:此运算涉及2个比特或更多的比特。在2比特运算中,只有第一个和第二个比特均为真的时候,结果才能是真。当涉及超过2个比特时,只有当所有的比特都为真时,结果才是真。
OR:OR运算也涉及2个比特或更多的比特。在2比特运算中,如果第一个或第二个比特为真,结果为真;否则,结果为假。在超过2个比特的情况下,只要有比特为真,则结果为真。
XOR:如果第一个和第二个比特具有不同的值,则异或运算的结果为真。因为“exclusive-or”拗口,我们经常使用缩写XOR(发音为“ex-or”)。
图1-1将这些布尔运算以图示的形式概括为真值表。框外的表示输入,框内的表示输出。真值表中,T代表True,F代表False。
图1-1 布尔运算真值表
图1-2展示了NOT和AND运算的工作原理。我们可以通过跟踪输入路径来找到输出。
图1-2 使用真值表的方式
正如你所看到的,NOT运算只是反转输入的状态。此外,AND运算只有在两个输入都为真的情况下才会返回真。
注意
XOR运算是由其他运算建立起来的。例如,2个比特a和b的XOR运算与(a OR b) AND NOT(a AND b)是一样的。这表明基本的布尔运算用不同的方式组合起来会产生相同的结果。
1.4.2 德摩根定律
19世纪,英国数学家Augustus De Morgan添加了一条只适用于布尔代数的定律,即同名的德摩根定律。该定律规定,运算a AND b相当于运算NOT(NOT a OR NOT b),如图1-3所示。
图1-3 德摩根定律真值表
注意,第二列中a AND b的结果与最后一列中NOT(NOT a OR NOT b)的结果完全相同。这意味着只要有足够的NOT运算,我们就可以用OR运算代替AND运算(反之亦然)。这是有用的,因为计算机运算的是不受它控制的来自真实世界的输入。虽然输入的形式是“冷”或“下雨”会比较好,但实际中它们往往是“不冷”或“不下雨”。类似于英语等语言中的双重否定句(如“we didn't not go skiing”),德摩根定律是一个工具,除了我们已经见过的正逻辑外,它还能让我们运算这些负逻辑命题。图1-4展示了正逻辑和负逻辑形式的穿衣决策。
图1-4 正逻辑与负逻辑
在左边(正逻辑),我们可以用一个OR运算来进行决策。在右边(负逻辑),德摩根定律允许我们使用一个AND运算来进行决策。如果没有德摩根定律,我们就必须将负逻辑的情况执行为“NOT不冷OR NOT不下雨”。虽然这样做是可行的,但每一次运算都是有金钱和性能成本的,所以最小化运算量会使成本最小化。执行NOT运算的硬件会花费真金白银,而且下一章会讲到级联运算会减慢速度。