1.3 算术运算和逻辑运算
1. 算术运算要点
(1)移位操作
① 原码移位:原码进行算术左移和算术右移都不改变原码本身形态。左移一位相当于乘以 2,右移一位相当于除以 2,移位出现的空位补 0。这是因为原码与二进制数真值的绝对值是完全一样的,算术移位并不涉及数的符号。
② 补码移位:由于正数的补码与原码是一样的,所以正数的补码左、右移位所出现的空位补 0 均不会改变补码的形态。值得注意的是负数补码的移位,当负数的补码右移时所出现的空位必须补 1 才能保证数值的正确及形体的保持。
③ 反码移位:由于正数的反码与原码相同,所以正数的反码左移一位相当于乘以2,左移出现的空位补 0,右移一位相当于除以 2,右移出现的空位补 0。负数的反码左移一位相当于乘以 2,右移一位相当于除以 2,但左、右移位出现的空位必须补 1。
(2)不同编码下的规格化数
浮点数是由数的阶码和数的尾数构成的。令数的尾数为 ,则浮点规格化数的标准为 。规格化数的这一要求是从尾数的真值划定的标准,即要求尾数的绝对值大于或等于 (相当于二进制数的 )。
正数的规格化数无论是哪种编码,其尾数的最高位均为 1;负数的规格化数除原码外,其他编码尾数的最高位均为 0。
(3)溢出判断
定点运算、浮点运算都会遇到溢出的问题,这是因为计算机中的运算是在一个有限制的空间进行的,当运算结果出现大于空间所允许的最大值时,则会出现上溢溢出;当运算结果出现小于空间所允许的最小值时,则会出现下溢溢出。计算机把引起上溢溢出的值称为机器无穷大,把引起下溢溢出的值称为机器零。
浮点数是由阶和尾数构成的,浮点运算的溢出与否是由结果的阶来决定的,当运算结果的阶出现大于或小于计算机所容许的最大、最小值时,则会发生上溢或下溢溢出。由于浮点数的阶是一个定点正数,且为 2 的指数,所以判定浮点运算可由阶所表示的量值给出。
定点加法、减法采用补码求和的运算方法,判断运算中的溢出有两种办法:一种是利用进位值,另一种是利用符号状态。进位判断溢出是检查尾数最高位的进位与符号位的进位是否相同,若相同表明没有溢出,若不同表明发生了溢出。
采用变形补码求和是借助两个符号的组合状态判定是否溢出。两个符号有 4 种组合状态:00、01、10、11。当组合状态为 01 或者 10 时,表示运算发生了溢出。
(4)舍入及误差
由于运算收到操作空间的限制,在运算中出现舍入是在所难免的,而舍入必然会带来误差。因此,怎样处理舍入使得误差最小是把握运算结果的问题之一。分析误差的大小,确保运算结果的精确度是把握运算结果的又一问题。
对于一个 n + 1 位的运算结果 0.100000001,放入一个 n 位的单元中,必然会出现因截尾而产生误差。这种误差被称为截断误差。
为了提高运算结果的精度,减少误差,通常采用舍入处理。常用的舍入处理有两种。一种是“0 舍 1 入”,即被舍掉的位为 1 则在其上一位进 1;舍掉的位为 0,则不进 1。
另一种舍入处理是采取“恒 1”的方法,即不管舍去的是何值,均在尾数的最低位置 1。
分析误差的方法有两种:一种是计算绝对误差,另一种是计算相对误差。
2. 逻辑运算要点
逻辑运算分为基本逻辑运算和复合逻辑运算。基本逻辑运算有与、或、非 3 种运算,复合逻辑运算有与或运算、与非运算、与或非运算、异或运算、同或运算 6 种。利用逻辑运算可以建立逻辑变量,和逻辑函数的逻辑表达式,用以描写、刻画逻辑关系,解决实际逻辑问题。基本逻辑运算和复合逻辑运算也都是由逻辑自变量与因度量的逻辑函数表达式给出的。令 A、B 为逻辑自变量,F 为逻辑函数,则逻辑关系如表 1-15 所示。
逻辑运算的重要工具是真值表,真值表可以把逻辑变量与逻辑函数的取值用一张表全部开列出来。由于一个自变量有 0、1 两种取值,两个自变量则有 种取值组合,3个自变量有 种取值组合,所以两个变量的函数表达式对应的真值表为 4 行,3 个自变量的真值表为 8 行,n 个自变量的真值表为 行。
真值表作为逻辑运算的工具,它还可以证明两个函数的相互关系。若两个函数的真值表相同,那么两个函数相等,原函数与反函数的真值表的函数值往往相反。
掌握基本逻辑关系和逻辑定理、定律才能较好地化简逻辑表达式,而化简逻辑表达式是逻辑电路设计的重要环节。
逻辑运算来源于实践,它必然可以指导实践,借助逻辑运算可以完成各种应用问题,除用其设计逻辑电路,解决生产、生活中的诸多逻辑问题外,还可以进行数据处理、码制变换、代码转换等。有关应用举例如下。
① 逻辑截取:使用与运算,选择适当的逻辑常数可以在已知信息中截取一部分信息。例如把定点数的符号与尾数分开,截取浮点数的阶码等。
② 码制转换:使用异或运算或者同或运算,选择适当的逻辑常数,可以把原码变为反码,把补码变为移码。
③ 代码转换:使用或运算,选择适当的逻辑常数可以把 0~9 的 BCD 码变成字符的 ASCII 码。使用与运算可以把字符数字变成相应的数字。例如把字符‘9’变成数值 9。
此外,使用逻辑运算还可以求负数的绝对值,确定乘积或者商的符号,构造奇、偶校验码等。
难点分析
1. 算术运算
1)概述
在计算机内进行加、减、乘、除等运算,由于运算环境的不同,操作数的形式不同,使得在运算中出现了不少新问题,也表现出了以下新特点:
第一,由于运算空间的限制,运算中会出现误差的问题。例如,在 8 位的运算空间里,如果得到一个 9 位数的计算结果就会因为丢掉一位而产生截断误差,从而影响记数结果的精度。
第二,当运算空间恒定后,空间所能容纳数的范围也被限定了。一旦在运算中出现过大或者过小的计算结果就会发生越界而产生出溢出问题,继而引起”中断“计算的问题。
第三,在计算机中,参与运算的数是二进制数,利用运算器的左、右移位可以方便地进行乘、除法运算。
第四,由于数有原码、反码、补码、移码等多种形式,按照不同编码的特点,常用的算术运算有补码加、减运算,原码乘、除运算等。按照数的形式有定点运算、浮点运算等。但不管哪种运算都需要考虑运算结果的符号问题、运算中的溢出判断问题等。
2)补码加、减运算
(1)运算方法
引入补码可以把减法运算变为加法运算。使用补码求和的运算方法可以把加法和减法统一为加法,且适用于定点小数和定点整数运算。补码求和的运算方法如下:
(2)判定溢出的方法
使用运算中的两个进位值的状态组合,可以判定出运算中的溢出。令 表示尾数高位向符号位的进位, 为符号位在运算中的进位,则溢出判定如表 1-18 所示。
3)变形补码加减运算
使用变形补码进行加、减运算是用两数的变形补码求和(有人称为双符号运算),同样是把加法和减法统一为加法,最后的运算结果为变形补码和。在运算后,用两个符号位的状态判定运算是否正常。
4)原码一位乘法(P57)
5)原码一位除法(P58)
6)浮点数的加减运算
浮点数是由阶码和尾数组成的,浮点数的加减运算只需要对两个操作数的尾数进行运算。为了使尾数在相同的位权下对位操作,在操作前需要通过对阶使二数的阶码相等,然后再进行尾数的加减操作。为了使操作结果规范化,对加减后的结果还需进行规格化处理。在有限的操作空间里进行加减及左、右移位,可能出现舍去低位的问题,为了保证运算结果精度,在运算中还需要考虑采用哪种舍入处理。此外,运算中是否发生了结果越界而出现溢出也是运算的重要环节。概括起来,浮点数的加减运算需要进行对阶、尾数运算、规格化、舍入处理及溢出判断等步骤。
7)浮点数的乘除运算
①浮点数乘法:二浮点数相乘,尾数相乘,阶码相加,乘积的符号用两个操作数符号的异或得出。在相乘过程中也需要处理舍入,判断溢出,对乘积进行规格化等。
②浮点数除法:二浮点数相除,商的尾数由被除数的尾数除以除数的尾数产生,商的阶码由被除数的阶码减除数的阶码得出,而商的符号由二操作数符号的“异或”结果确定。
2. 逻辑运算
1)逻辑运算概述
逻辑运算是对二值变量进行的运算,所谓二值变量是指只有 0、1 两个值的变量。
2)基本逻辑运算
(1)与运算
与运算所描写的是两个(或多个)并列条件决定某一事物成立与否的问题。例如,两个串联的开关控制一盏电灯,电灯亮与不亮取决于两个开关的状态。若把开关接通定义为 1,把开关断开定义为 0,电灯亮定义为 1,不亮定义为 0,这样,两个串联开关控制一盏电灯的问题就成了一个二值变量的操作问题。由于两个开关有 4 种状态组合,而使其所控制的电灯产生“亮”与“不亮”的两种结果,于是可以把两个开关和一盏电灯的状态用二值变量来描写,并可以用一张表把两个开关和一盏电灯的状态展示出来。这张表被称为真值表。
“∧”和“•”为与运算的运算符,书写中还可以省略。概括上述运算规则,可以用一句话来表述:“两端同时为 1,结果为 1,否则为 0”,即只有在操作符的两端同时为 1 时,结果才为 1。与运算的法则准确地表述出只有两个并列条件同时成立时,事物才能成立的逻辑关系。
与运算有“截取信息”的功能,截取信息需借助适当的逻辑常数,这个逻辑常数是对应截取的信息位设定为 1,不截取的信息位设定为 0,该常数被称为“逻辑尺”。利用与运算的逻辑尺可以自如地分离信息、截取信息,它是信息处理的重要工具之一。
(2)或运算
或运算所描写的是由两个或多个条件决定某一事物是否成立,且当有其中一个条件成立就可以使事物成立的逻辑关系。例如,两个并联的开关控制一个电灯,只要有其中一个开关接通,电灯就可以亮的事物就是或运算的依据。像分析与运算一样, 把开关看成是自变量,把电灯看成是函数,两个开关有 4 种组合状态,分别作用在电灯上,使其产生亮与不亮的两种结果。将自变量与函数的对应关系列成一张表,这就是或运算的真值表。
“∨”、“+”为或运算的运算符。或运算的运算法则也可以概括为一句话,即“有 1 为 1,否则为 0”。
(3)非运算
非运算所描写的是当条件成立时,事物反而不成立;当条件不成立时,事物反而成立的客观现实。约定“有为 1,没有为 0”。其运算法则为:当 Y = 1 时, ,即 F = 0;当 Y = 0 时,,即 F = 1。
3)符合逻辑运算
异或运算的法则可以概括为一句话:“相异为 1,否则为 0”;而同或运算为:“相同为 1,否则为 0”.
4)基本逻辑关系
在逻辑代数中有两个逻辑常数,即 0 和 1.逻辑常数与任意一个逻辑变量(假设为 A)有如下基本关系;
这些基本关系是逻辑表达式化简的工具。
5)逻辑代数定律
逻辑代数也像普通代数一样有许多定律,利用这些定律可以对逻辑表达式进行变换、化简。每一个逻辑表达式都可以用真值表去证明,即把等式的左、右两端都列出真值表、若真值表相同,则表达式相等。
(1)交换律
(2)结合律
(3)分配律
(4)重叠律
(5)吸收律
(6)包含律
(7)德 • 摩根定理
6)逻辑表达式化简
逻辑表达式是逻辑电路的基础,化简逻辑表达式相当于简化了逻辑电路,简化逻辑电路不但可以节省元器件,而且还可以提高逻辑电路的运行速度。
利用基本逻辑关系、逻辑代数定律化简逻辑表达式称为代数化简法。代数化简法是利用基本关系及定律对逻辑表达式中的各项进行合并、消去、吸收等变换使其成为与或表达式,且使表达式中的项数最少,变量个数最少。减少项数相当于减少逻辑电路中的元件,减少变量相当于减少了输入。
掌握逻辑表达式化简并非易事,所遇到的最大困惑是不清楚是否达到了最简程度。
几何化简法的基本思路是把任意一个逻辑变量看成是直角坐标系中的一条直线,两个变量所对应的是两条垂直相交的直线,而相交点为两个变量相与关系。设两个逻辑变量 A 和 B,它们所对应的直线可以构成一个平面。
几何化简法的操作是按照函数表达式中的与项先在几何图上找出对应的点,然后查看两点是否在同一条直线上,若在同一条直线上则可以化简,否则不能化简。如果 4 条直线能够构成一个面,那么可以再次化简。也就是说,化简的步骤是由点到线,再由线到面。对于找不到对应点的与项可使用配项法变为标准型后再实施化简。这种对照几何图形的化简方法既可以一目了然地取得化简结果,又可以判断出函数表达式是否是最简式。
7)逻辑表达式的建立
任何一个逻辑表达式都表示一种逻辑关系,这种逻辑关系归根结底是逻辑自变量与逻辑因变量的关系。为了解决实际的逻辑问题,也可以借助真值表和最小项定理建立逻辑表达式。
在逻辑代数中,把能够使函数为 1 的与项称为最小项,而任何一个逻辑函数都可以写成它的最小项之或。
概括以上分析,可以把针对逻辑问题建立逻辑函数表达式的过程归纳为一下 4 步:
① 提出逻辑问题,确定逻辑变量和函数。
② 按照问题的要求布列真值表。
③ 根据真值表写出最小项之或的函数表达式。
④ 对函数表达式进行化简。
参考文献:
[1]刘克武.软件设计师考试科目1:计算机与软件工程知识——考点解析及模拟训练[M].北京:清华大学出版社,2005.1.