知识点

二进制四则运算

定义

nn 位无符号整数把全部位宽用于表示大小:第 ii 位(最低位为第0位)的权是 2i2^i,因此它表示 00 到 2n−12^n-1 之间的全部整数,共 2n2^n 个不同的值。位权与进制记号的由来见进制转换。

位宽最大值常见对应
8位2552551字节
16位6553565535短整数
32位42949672954294967295单字(约42亿)

下文用固定位宽书写,(0101)2(0101)_2 表示4位二进制数 01010101;下标2是底数,不属于数值。

加法从最低位起逐位相加,逢二进一:

  • 1+1=(10)21+1=(10)_2:本位写0,向高位进1;
  • 1+1+1=(11)21+1+1=(11)_2:本位写1,向高位进1。

所以竖式中每一列的输入是“两个加数位 + 低位送来的进位”,输出是“本位和 + 向高位的进位”,一次最多进1。

性质

加法的位宽与溢出

两个 nn 位无符号数相加,真实和最多需要 n+1n+1 位。若真实和超过 2n−12^n-1,最高位的进位在 nn 位容器中放不下,被直接丢弃,容器里的结果等于真实和减去 2n2^n:计数从最大值回绕到0,再继续累加。这像只能正转的里程表,走到全1之后再走一格,显示回到全0。

乘法的移位相加

乘数的每一位只有0和1,所以部分积只有两种:该位为1时,把被乘数抄下来并按位左移;该位为0时,整行为0。把各行的部分积相加即得乘积。

两个 nn 位无符号数相乘最多需要 2n2n 位才一定放得下,因此在 nn 位容器里直接存放乘积可能被截断。

除法的移位与相减

二进制长除法与十进制长除法相同:每轮把被除数的一位落下来,与除数比较,够除则商写1并减去除数,不够除则商写0。每一位的商只可能是0或1,所以“试商”退化成一次比较。

重复减法可以说明商和余数的含义:余数反复减去除数,能减几次商就是几。实际处理器可采用其他除法算法,不能仅据此判断具体执行代价。

例子

竖式计算 (0101)2+(0011)2(0101)_2+(0011)_2(4位)

0101(5)+  0011(3)1000(8)\begin{array}{rl} 0101 & (5) \\ +\;0011 & (3) \\ \hline 1000 & (8) \end{array}
  1. 最低位:1+1=101+1=10,写0进1。

  2. 次低位:0+1+1=100+1+1=10,其中一个是低位送来的进位,写0进1。

  3. 第三位:1+0+1=101+0+1=10,同样写0进1。

  4. 最高位:0+0+1=10+0+1=1,不再产生进位。

结果 (1000)2=8(1000)_2=8,与 5+35+3 一致。

竖式计算 (0101)2×(0011)2(0101)_2\times(0011)_2

0101(5)×0011(3)0101最低位为1,抄下被乘数1010次低位为1,左移一位+0000第三位为0,整行取01111(15)\begin{array}{rll} & 0101 & (5) \\ \times & 0011 & (3) \\ \hline & 0101 & \text{最低位为1,抄下被乘数} \\ & 1010 & \text{次低位为1,左移一位} \\ + & 0000 & \text{第三位为0,整行取0} \\ \hline & 1111 & (15) \end{array}

三行部分积分别对应乘数的低三位;乘数最高位为0,对应的一行全为0,省略不写。写的时候已经按位左移对齐,相加时按列处理即可。

乘积 (1111)2=15(1111)_2=15 仍在4位范围内。若乘数更大,部分积会超过4位,需要更宽的容器存放。

长除法计算 (1111)2÷(11)2(1111)_2\div(11)_2

被除数 (1111)2=15(1111)_2=15,除数 (11)2=3(11)_2=3。

  1. 取最高两位:1111 与除数 1111 比较,11≥1111\ge 11,商的最高位取1,余数 11−11=011-11=0。

  2. 落下第三位:余数拼成 11,1<111<11,这一位商取0,余数仍为 11。

  3. 落下第四位:余数拼成 1111,11≥1111\ge 11,这一位商取1,余数 11−11=011-11=0。

商是 (101)2(101)_2,余数是0。回代 (101)2×(11)2=(1111)2(101)_2\times(11)_2=(1111)_2,与被除数一致。

交互探索

调整两个四位无符号数,比较完整的加法结果与低四位。

四位无符号加法何时产生进位?

改变两个四位数,比较完整结果和四位寄存结果。

正在准备演示…

题集

练习

  1. 8位无符号整数能表示多少个不同的值?最大值是多少?

    1. 不同值的个数是 。

      参考解答

      位宽为 nn 时共有 2n2^n 个编码,28=2562^8=256。

    2. 最大值是 。

      参考解答

      最小值是0,最大值是 28−1=2552^8-1=255。

  2. (0110)2+(0011)2(0110)_2+(0011)_2 的结果用4位二进制表示是 (只填0和1,不写下标)。

    参考解答

    6+3=9=(1001)26+3=9=(1001)_2。最低位 0+1=10+1=1 不进位,中间两位各产生一次进位,最高位再加上进位得1。

  3. 用4位容器计算 (1111)2+(0001)2(1111)_2+(0001)_2,容器中保存的结果是:

    选择答案
    参考解答

    真实和是 16=(10000)216=(10000)_2,需要5位。4位容器丢弃最高位的进位,只剩 (0000)2(0000)_2,即回绕到0。

  4. (0101)2×(0010)2(0101)_2\times(0010)_2 的积是 (只填0和1)。

    参考解答

    乘数 (0010)2(0010)_2 只有权为 212^1 的那一位是1,部分积只有一行:被乘数左移一位,得 (1010)2=10(1010)_2=10。

  5. 用长除法计算 (1100)2÷(10)2(1100)_2\div(10)_2,商和余数分别是多少?

    1. 商是 (只填0和1)。

      参考解答

      (1100)2=12(1100)_2=12,(10)2=2(10)_2=2,12÷2=6=(110)212\div 2=6=(110)_2。

    2. 余数是 。

      参考解答

      被除数末位是0,1212 能被 22 整除,余数为0。