计算机是一种复杂的机器,这个没错,但它有一个简单的核心模型:
数据输入后缓存在内存中,CPU从内存中取出一些数放到寄存器中,CPU核(运算单元)从这些寄存器中取出数(操作数)进行运算,运算结果放回寄存器中,CPU再把结果放到内存中,数据输出单元就可用从内存中读出数,输出给用户。
在用户的角度,只有内存可以保存数,那么保存在内存中的2个数,不通过内存的第三个保存位置,能否将2个数的值对换呢?
好像不行吧!但确实可以的。不过需要一种计算机特色的运算——按位运算。
按位运算基于逻辑运算和二进制数,所以要先介绍逻辑运算和二进制数。逻辑运算中只有2个值——真(True)和假(False),四种运算——与(and)、或(or)、异或(xor,Python使用^)、非(not)。运算规律如下四点:
(1)只有两个操作数都为真(True)时,与(and)操作才是真(True),其它都是假(False);第一个操作数为假(False)时,不检查第二操作数,直接熔断为假(False)。
(2)只有两个操作数都为假(False)时,或(or)操作才是假(False),其它都是真(True);第一个操作数为真(True)时,不检查第二操作数,直接熔断为真(True)。
(3)两个操作数不一样时,异或(^)操作是真(True),否则是假(False);
(4)非(not)真(True)是假(False),非(not)假(False)是真(True)。
当没有括号的情况下,哪个运算符的优先级高呢?
(1)True or True and False = True
(2)False and True ^ True = False
分析,(1)如果and的优先级不高于or,结果必为False,所以and优先级高于or;(2)如果^的优先级不高于and,结果必为True,所以^的优先级高于and;(3)not是单目操作符,优先级比双目运算符高,得到以下优先级:
() > not > ^ > and > or。
练习1:判断下面逻辑算式的值,然后用Python验证:
(1)True or False and False
(2)False and True ^ False
(3)True or True and False
(4)False and True or False
(5)False or True and True
(6)False ^ False or False
由于计算机都是用二态元件记录数的,所以计算机里储存的数都是二进制数。有关二进制数的知识可以参考本公众号的《认识二进制数与易卦图》。二进制数的每一个数位上不是1就是0,如果把1等同于真(True)、0等同于假(False),那么每个数位都可以进行逻辑运算,这种运算是按位运算了。四种按位运算——与(&)、或(|)、异或(^)、取反(~)。它们的优先级如何呢?
(1)1 | 1 ^ 1 = 1
(2)1 ^ 1 & 0 = 1
分析,(1)如果^的优先级不高于|,结果必为0,所以^优先级高于|;(2)如果&的优先级不高于^,结果必为0,所以&的优先级高于^;(3)~是单目操作符,优先级比双目运算符高,得到以下优先级:
() > ~ > & > ^ > |。
练习题2:判断下面按位算式的值,然后用Python验证:
(1)1 | 0 ^ 1
(2)1 ^ 1 & 1
(3)1 | 1 ^ 1
(4)1 ^ 1 & 0
(5)0 | 1 ^ 1
(6)1 ^ 1 & 1
这一课到此结束,下一课继续讨论按位运算。