1.4 二进制算术运算
1.4.1 二进制算术运算的特点
当两个二进制数码表示两个数量大小时,它们之间可以进行数值运算,这种运算称为算术运算。二进制算术运算和十进制算术运算的规则基本相同,唯一的区别在于二进制数是“逢二进一”而不是十进制数的“逢十进一”。
例如,两个二进制数1001和0101的算术运算:
加法运算
1001
+ 0101
------
1110
减法运算
1001
- 0101
------
0100
乘法运算
1001
× 0101
------
1001
0000
1001
------
10101
除法运算
1001 ÷ 0101 = 1 余数 0100
从上面的例子中可以看到二进制算术运算的两个特点,即二进制数的乘法运算可以通过若干次的“被乘数(或零)左移1位”和“被乘数(或零)与部分积相加”这两种操作完成;而二进制数的除法运算能通过若干次的“除数右移1位”和“从被除数或余数中减去除数”这两种操作完成。
如果我们再能设法将减法操作转化为某种形式的加法操作,那么加、减、乘、除运算就全部可以用“移位”和“相加”两种操作实现了。利用上述特点能使运算电路的结构大为简化。这也是数字电路中普遍采用二进制算术运算的重要原因之一。
1.4.2 反码、补码和补码运算
在数字电路中,通常用逻辑电路输出的高、低电平表示二进制数的1和0。那么数的正、负又如何表示呢?通常采用的方法是在二进制数的前面增加一位符号位。符号位为0表示这个数是正数,符号位为1表示这个数是负数。这种形式的数称为原码。
在做减法运算时,如果两个数是用原码表示的,则首先需要比较两数绝对值的大小,然后以绝对值大的一个作为被减数、绝对值小的一个作为减数,求出差值,并以绝对值大的一个数的符号作为差值的符号。这种操作过程比较麻烦,而且需要使用数值比较电路和减法运算电路。如果能用两数的补码相加代替上述的减法运算,那么计算过程中就无需使用数值比较电路和减法运算电路了,从而使运算器的电路结构大为简化。
为了说明补码运算的原理,我们先来讨论一个生活中常见的事例。例如,你在5点钟的时候发现自己的手表停在10点上了,因而必须把表针拨回到5点。由图1.4.1可以看出,这时有两种拨法:第一种拨法是往回拨5格,10-5=5,拨回到了5点;另一种拨法是往前拨7格,10+7=17。由于表盘的最大数只有12,超过12以后的“进位”将自动消失,于是就只剩下减去12以后的余数了,即17-12=5,也将表针拨回到了5点。这个例子说明,10-5的减法运算可以用10+7的加法运算代替。因为5和7相加正好等于产生进位的模数12,所以我们称7为-5对模12的补数,也称为补码(Complement)。
从这个例子中可以得出一个结论,就是在舍弃进位的条件下,减去某个数可以用加上它的补码来代替。这个结论同样适用于二进制数的运算。
由图可见,1011-0111=0100的减法运算,在舍弃进位的条件下,可以用1011+1001=0100的加法运算代替。因为4位二进制数的进位基数是16(10000),所以1001(9)恰好是-0111(-7)对模16的补码。
基于上述原理,对于有效数字(不包括符号位)为n位的二进制数N,它的补码(M)表示方法为:
𝑀=2𝑛−𝑁M=2n−N
即正数(当符号位为0时)的补码与原码相同,负数(当符号位为1时)的补码等于 2𝑛−𝑁2n−N。符号位保持不变。
在一些国外的教材中,也将上述定义的补码称为“2的补码”(2's Complement)。为了避免在求补码的过程中做减法运算,通常是先求出N的反码(𝑁ˉNˉ),然后在负数的反码上加1而得到补码。二进制N的反码(𝑁ˉNˉ)是这样定义的:
𝑁ˉ=2𝑛−1−𝑁Nˉ=2n−1−N
即将N中每一位的1改为0,0改为1,就得到了𝑁ˉNˉ。以后我们将会看到,将二进制数的每一位求反,在电路上是很容易实现的。
由上述公式可知,当N为负数时,𝑁ˉ+1=2𝑛−𝑁Nˉ+1=2n−N,而2^n - N即为N的补码。
例1.4.1 写出带符号位二进制数00011010(+26)、10011010(-26)、00101101(+45)和10101101(-45)的反码和补码。
解: 根据上述公式得到:
原码 | 反码 | 补码 |
---|---|---|
00011010 | 00011010 | 00011010 |
10011010 | 11100101 | 11100110 |
00101101 | 00101101 | 00101101 |
10101101 | 11010010 | 11010011 |
表1.4.1是带符号位的3位二进制数原码、反码和补码的对照表。其中规定用1000作为-8的补码,而不用来表示-0。
十进制数 | 原码(带符号数) | 反码 | 补码 |
---|---|---|---|
+7 | 0111 | 0111 | 0111 |
+6 | 0110 | 0110 | 0110 |
+5 | 0101 | 0101 | 0101 |
+4 | 0100 | 0100 | 0100 |
+3 | 0011 | 0011 | 0011 |
+2 | 0010 | 0010 | 0010 |
+1 | 0001 | 0001 | 0001 |
+0 | 0000 | 0000 | 0000 |
-1 | 1001 | 1110 | 1111 |
-2 | 1010 | 1101 | 1110 |
-3 | 1011 | 1100 | 1101 |
-4 | 1100 | 1011 | 1100 |
-5 | 1101 | 1010 | 1011 |
-6 | 1110 | 1001 | 1010 |
-7 | 1111 | 1000 | 1001 |
-8 | 1000 | 0111 | 1000 |
下面再来讨论两个用补码表示的二进制数相加时,和的符号位如何得到。为此,我们在例1.4.2中列举出了两数相加时的四种情况。
例1.4.2 用二进制补码运算求出13+10, 13-10, -13+10和-13-10。
解: 由于13+10和-13-10的绝对值为23,所以必须用有效数字为5位的二进制数才能表示,再加上一位符号位,就得到6位的二进制补码。
由公式可知,+13的二进制补码应为001101(最高位为符号位),-13的二进制补码为110011,+10的二进制补码为001010,-10的二进制补码为110110。计算结果分别为:
- 13 + 10
001101 (+13)
+ 001010 (+10)
-----------
010111 (+23)
- 13 - 10
001101 (+13)
+ 110110 (-10)
-----------
000011 (+3)
- -13 + 10
110011 (-13)
+ 001010 (+10)
-----------
111101 (-3)
- -13 - 10
110011 (-13)
+ 110110 (-10)
-----------
101001 (-23)
从上面的例子中可以看出,若将两个加数的符号位和来自最高有效数字位的进位相加,得到的结果(舍弃产生的进位)就是和的符号。这一方法仍然可以用图1.4.2所示的图形来说明。
需要强调的是,在两个同符号数相加时,它们的绝对值之和不可超过有效数字位所能表示的最大值,否则会得出错误的计算结果。
表1.4.1 带符号位的3位二进制数原码、反码和补码对照表
十进制数 | 原码(带符号数) | 反码 | 补码 |
---|---|---|---|
+7 | 0111 | 0111 | 0111 |
+6 | 0110 | 0110 | 0110 |
+5 | 0101 | 0101 | 0101 |
+4 | 0100 | 0100 | 0100 |
+3 | 0011 | 0011 | 0011 |
+2 | 0010 | 0010 | 0010 |
+1 | 0001 | 0001 | 0001 |
+0 | 0000 | 0000 | 0000 |
-1 | 1001 | 1110 | 1111 |
-2 | 1010 | 1101 | 1110 |
-3 | 1011 | 1100 | 1101 |
-4 | 1100 | 1011 | 1100 |
-5 | 1101 | 1010 | 1011 |
-6 | 1110 | 1001 | 1010 |
-7 | 1111 | 1000 | 1001 |
-8 | 1000 | 0111 | 1000 |
总结
通过以上对数制、码制及其转换方法的介绍,我们了解到数字电路中使用的主要数制及其转换方法。尤其是在二进制算术运算中,补码的使用极大地简化了电路设计,使加减运算统一为加法操作,提高了运算效率和可靠性。这些知识为我们进一步学习和设计复杂的数字电路打下了坚实的基础。