计组_原码一位乘法

原码一位乘法:

笔算乘法

  • 乘法A*B转换为关于A的若干次移位和加法(怎么移位的由乘数B的各个位来决定)
  • 简单的加法运算(而且每次加法总是有一个操作数取值为A(或者0)(也就是被乘数或者0参与和 此次加法前得到的部分积的加法运算操作))

在这里插入图片描述

  • 从上面的加法/移位交替计算的过程中可以看到,加法结果每次移位,蓝绿色区域内的数就会增加一位,这些位都将作为最终的的’‘乘法’'结果的低位
    • 他们不受后续高位计算的影响而改变数值(但是仍然参与移位)
  • 上述演算中,可以看到,得到最终结果的过程中,低位是最早被确定的

    • 而且不受后续高位结果位的影响

    • 各层部分积低位随着计算的进行,逐渐被作为总结果的低位而确定下来

      • 总结果的低位部分和早期计算的部分积的低位一致
    • 🥰04/02/2022 14:33:49

    • 既然部分积的最低位最早可以确定,那么将这一位保存到合适的位置后(即最终结果的最低位开始)),

      就可以将原先保存乘数的寄存器的低位用于存放别的数据(譬如新的部分积)

笔算乘法的改进

  • ∑ i = p n x i r − i = r − q ∑ i = p n x i r q − i p = q = 1 时 : ∑ i = 1 n x i r − i = r − 1 ( ∑ i = 1 n x i r 1 − i ) = r − 1 ( x 1 + ∑ i = 2 n x i r 1 − i ) = r − 1 ( x 1 + r − 1 ( x 2 + ∑ i = 3 n x i r 2 − i ) ) = r − 1 ( x 1 + r − 1 ( x 2 + ⋯ r − 1 ( x n − 1 + ∑ i = n n x i r ( n − 1 ) − i ) ) ) = r − 1 ( x 1 + r − 1 ( x 2 + ⋯ r − 1 ( x n − 1 + r − 1 ( x n + 0 ) ) ) ) ∑ i = 1 n x i r − i = r − 1 ( x 1 + r − 1 ( x 2 + ⋯ r − 1 ( x n − 1 + r − 1 ( x n + 0 ) ) ) ) K ∑ i = 1 n x i r − i = K r − 1 ( x 1 + r − 1 ( x 2 + ⋯ r − 1 ( x n − 1 + r − 1 ( x n + 0 ) ) ) ) = r − 1 ( K x 1 + r − 1 ( K x 2 + ⋯ r − 1 ( K x n − 1 + r − 1 ( K x n + 0 ) ) ) ) \sum_{i=p}^{n}x_ir^{-i} \\ =r^{-q}\sum_{i=p}^{n}x_ir^{q-i} \\p=q=1时: \\ \sum_{i=1}^{n}x_ir^{-i} =r^{-1}(\sum_{i=1}^{n}x_ir^{1-i}) =r^{-1}(x_1+\sum_{i=2}^{n}x_ir^{1-i}) \\ =r^{-1}(x_1+r^{-1}(x_2+\sum_{i=3}^{n}x_ir^{2-i})) \\ =r^{-1}(x_1+r^{-1}(x_2+\cdots{r^{-1}(x_{n-1}+\sum_{i=n}^{n}x_ir^{(n-1)-i})})) \\ =r^{-1}(x_1+r^{-1}(x_2+\cdots{r^{-1}(x_{n-1}+ r^{-1}(x_n+0))})) \\\\ \sum_{i=1}^{n}x_ir^{-i} =r^{-1}(x_1+r^{-1}(x_2+\cdots{r^{-1}(x_{n-1}+ r^{-1}(x_n+0))})) \\ K\sum_{i=1}^{n}x_ir^{-i} =Kr^{-1}(x_1+r^{-1}(x_2+\cdots{r^{-1}(x_{n-1}+ r^{-1}(x_n+0))})) \\=r^{-1}(Kx_1+r^{-1}(Kx_2+\cdots{r^{-1}(Kx_{n-1}+ r^{-1}(Kx_n+0))})) i=pnxiri=rqi=pnxirqip=q=1:i=1nxiri=r1(i=1nxir1i)=r1(x1+i=2nxir1i)=r1(x1+r1(x2+i=3nxir2i))=r1(x1+r1(x2+r1(xn1+i=nnxir(n1)i)))=r1(x1+r1(x2+r1(xn1+r1(xn+0))))i=1nxiri=r1(x1+r1(x2+r1(xn1+r1(xn+0))))Ki=1nxiri=Kr1(x1+r1(x2+r1(xn1+r1(xn+0))))=r1(Kx1+r1(Kx2+r1(Kxn1+r1(Kxn+0))))

  • 特别的 , 当 r = 2 : ∑ i = 1 n x i 2 − i = 2 − 1 ( x 1 + 2 − 1 ( x 2 + ⋯ 2 − 1 ( x n − 1 + 2 − 1 ( x n + 0 ) ) ) ) K ∑ i = 1 n x i r − i = 2 − 1 ( K x 1 + 2 − 1 ( K x 2 + ⋯ 2 − 1 ( K x n − 1 + 2 − 1 ( K x n + 0 ) ) ) ) 特别的,当r=2: \\ \sum_{i=1}^{n}x_i2^{-i} =2^{-1}(x_1+2^{-1}(x_2+\cdots{2^{-1}(x_{n-1}+ 2^{-1}(x_n+0))})) \\ K\sum_{i=1}^{n}x_ir^{-i} =2^{-1}(Kx_1+2^{-1}(Kx_2+\cdots{2^{-1}(Kx_{n-1}+ 2^{-1}(Kx_n+0))})) 特别的,r=2:i=1nxi2i=21(x1+21(x2+21(xn1+21(xn+0))))Ki=1nxiri=21(Kx1+21(Kx2+21(Kxn1+21(Kxn+0))))

  • 对于 p ∈ [ 1 , n ] ∑ i = p n y i r ( p − 1 ) − i = r − 1 ∑ i = p n y i r ( p ) − i = r − 1 ( y p + ∑ i = p + 1 n y i r p − i ) 二进制数移位形式的递推 : ∑ i = p n y i 2 ( p − 1 ) − i = 2 − 1 ∑ i = p n y i 2 ( p ) − i = 2 − 1 ( y p + ∑ i = p + 1 n y i 2 p − i ) \\ 对于p\in[1,n] \\ \sum\limits_{i=p}^{n}y_ir^{(p-1)-i} =r^{-1}\sum\limits_{i=p}^{n}y_ir^{(p)-i} =r^{-1}(y_p+\sum\limits_{i=p+1}^{n}y_ir^{p-i}) \\ 二进制数移位形式的递推: \\ \sum\limits_{i=p}^{n}y_i2^{(p-1)-i} =2^{-1}\sum\limits_{i=p}^{n}y_i2^{(p)-i} =2^{-1}(y_p+\sum\limits_{i=p+1}^{n}y_i2^{p-i}) 对于p[1,n]i=pnyir(p1)i=r1i=pnyir(p)i=r1(yp+i=p+1nyirpi)二进制数移位形式的递推:i=pnyi2(p1)i=21i=pnyi2(p)i=21(yp+i=p+1nyi2pi)

  • 以小数为例 : 设 , 有真值 x , y 作乘数操作数 , 求它们的原码乘积 , 即 T ( x ) T ( y ) : T ( x ) = x 0 . x 1 x 2 ⋯ x n T ( y ) = y 0 . y 1 y 2 ⋯ y n x ∗ = ∣ x ∣ = 0. x 1 x 2 ⋯ x n y ∗ = ∣ y ∣ = 0. y 1 y 2 ⋯ y n x i , y i ∈ {   0 , 1   } T ( x ) T ( y ) = x 0 ⊕ y 0 . ( 0. x 1 x 2 ⋯ x n ) ( 0. y 1 y 2 ⋯ y n ) 以小数为例: \\设,有真值x,y作乘数操作数,求它们的原码乘积,即T(x)T(y): \\T(x)=x_0.x_1x_2\cdots{x_n} \\T(y)=y_0.y_1y_2\cdots{y_n} \\x^*=|x|=0.x_1x_2\cdots{x_n} \\y^*=|y|=0.y_1y_2\cdots{y_n} \\ x_i,y_i\in\set{0,1} \\T(x)T(y)=x_0\oplus{y_0}.(0.x_1x_2\cdots{x_n})(0.y_1y_2\cdots{y_n}) 以小数为例:,有真值x,y作乘数操作数,求它们的原码乘积,T(x)T(y):T(x)=x0.x1x2xnT(y)=y0.y1y2ynx=x=0.x1x2xny=y=0.y1y2ynxi,yi{0,1}T(x)T(y)=x0y0.(0.x1x2xn)(0.y1y2yn)

  • S = x ∗ ⋅ y ∗ = x ∗ ⋅ ∑ i = 1 n y i 2 − i = x ∗ ( 2 − 1 ( x ∗ y 1 + 2 − 1 ( x ∗ y 2 + ⋯ 2 − 1 ( x ∗ y n − 1 + 2 − 1 ( x ∗ y n + 0 ) ) ) ) ) 为了便于描述 : 记部分积为 { s i = y n − ( i − 1 ) ⋅ x ∗ + z i − 1 z i = 2 − 1 s i = 2 − 1 ( y n − ( i − 1 ) ⋅ x ∗ + z i − 1 ) ; ( i ∈ 0 , 1 , ⋯ , n ) ♣ 则 : z i = 2 − 1 s i ( 可见 , z i 可以由 s i 直接右移 1 位得到 ) 对于机器计算 s i 时 , 要先执行乘数的移位 ( 在表格法中 , 这个移位操作伴随着 z i − 1 的右移一起右移 ) 以便得到对应的乘数 b i t : y n − ( i − 1 ) ; 然后在执行加法操作 ( + z i − 1 ) , 得到 s i \\S=x^*\cdot{y^*}=x^*\cdot\sum\limits_{i=1}^{n}y_{i}2^{-i} \\=x^*(2^{-1}(x^*y_1+2^{-1}(x^*y_2+\cdots{2^{-1}(x^*y_{n-1}+ 2^{-1}(x^*y_n+0))}))) \\ 为了便于描述:记部分积为 \\ \begin{cases} s_i=y_{n-(i-1)}\cdot{x^*}+z_{i-1} \\z_i =2^{-1}s_i =2^{-1}(y_{n-(i-1)}\cdot{x^*}+z_{i-1}) ;(i\in{0,1,\cdots{,n}}) \end{cases} \\\clubsuit则:z_i=2^{-1}s_i \\(可见,z_i可以由s_i直接右移1位得到) \\对于机器计算s_i时,要先执行乘数的移位(在表格法中, \\这个移位操作伴随着z_{i-1}的右移一起右移) \\以便得到对应的乘数bit:y_{n-(i-1)};然后在执行加法操作(+z_{i-1}),得到s_i \\ S=xy=xi=1nyi2i=x(21(xy1+21(xy2+21(xyn1+21(xyn+0)))))为了便于描述:记部分积为{si=yn(i1)x+zi1zi=21si=21(yn(i1)x+zi1);(i0,1,,n):zi=21si(可见,zi可以由si直接右移1位得到)对于机器计算si,要先执行乘数的移位(在表格法中,这个移位操作伴随着zi1的右移一起右移)以便得到对应的乘数bit:yn(i1);然后在执行加法操作(+zi1),得到si

    • z 0 = 0 z 1 = 2 − 1 s 1 = 2 − 1 ( x ∗ y n + z 0 ) ) z 2 = 2 − 1 s 2 = 2 − 1 ( x ∗ y n − 1 + z 1 ) ) ⋮ z n = 2 − 1 s n = 2 − 1 ( x ∗ y 1 + z n − 1 ) ) 可见 S = x ∗ ⋅ y ∗ = z n ; 🎈 R H S ( 等式右边 ) , y 的下标和 z 的下标之和为 n ♠ 再强调一下取值范围的事 : ♣ x i , y i ∈ {   0 , 1   } 这意味着 , 虽然递推式中包含了乘法的形式 ( x ∗ y j , 但实际上 计算机执行的是加 x ∗ 或者加 0 即可 用表格模拟上述策略 , 可以 列出 z 0 ∼ z n 共 n + 1 行 ( n 是乘数 y 的位数 ) \\ \begin{aligned} &z_0=0 \\&z_1=2^{-1}s_1=2^{-1}(x^*y_n+z_0)) \\&z_2=2^{-1}s_2=2^{-1}(x^*y_{n-1}+z_1)) \\&\vdots \\&z_n=2^{-1}s_n=2^{-1}(x^*y_1+z_{n-1})) \end{aligned} \\可见S=x^*\cdot{y^*}=z_n; \\🎈RHS(等式右边),y的下标和z的下标之和为n \\\\ \spadesuit再强调一下取值范围的事: \\ \clubsuit x_i,y_i\in\set{0,1} \\这意味着,虽然递推式中包含了乘法的形式(x^*y_j,但实际上 \\计算机执行的是加x^*或者加0即可 \\用表格模拟上述策略,可以 \\列出z_0\sim{z_n}共n+1行(n是乘数y的位数) z0=0z1=21s1=21(xyn+z0))z2=21s2=21(xyn1+z1))zn=21sn=21(xy1+zn1))可见S=xy=zn;🎈RHS(等式右边),y的下标和z的下标之和为n再强调一下取值范围的事:xi,yi{0,1}这意味着,虽然递推式中包含了乘法的形式(xyj,但实际上计算机执行的是加x或者加0即可用表格模拟上述策略,可以列出z0znn+1(n是乘数y的位数)

    • 上述的 z 1 , z 2 , ⋯   , z n 每一个式子就是一轮操作 ( 加法操作和移位操作的先后执行 ) 再比较这些式子 , 它们在形式 ( 结构上是一样的 ) , 不变的元素是因子 2 − 1 ( 表示向右移位 ) ; x ∗ y j 中 y j 不像 x ∗ , 在不同的 z i 式子中可能是不同 体现在机器做乘法的过程中 , 就是要连通乘数 y ∗ 也一并做右移位 ( 使得乘数的末位就是参与分布乘法的 b i t ) 上述的z_1,z_2,\cdots,z_n每一个式子就是一轮操作 \\(加法操作和移位操作的先后执行) \\再比较这些式子,它们在形式(结构上是一样的), \\不变的元素是因子2^{-1}(表示向右移位); \\x^*y_j中y_j不像x^*,在不同的z_i式子中可能是不同 \\体现在机器做乘法的过程中,就是要连通乘数y^*也一并做右移位 \\(使得乘数的末位就是参与分布乘法的bit) 上述的z1,z2,,zn每一个式子就是一轮操作(加法操作和移位操作的先后执行)再比较这些式子,它们在形式(结构上是一样的),不变的元素是因子21(表示向右移位);xyjyj不像x,在不同的zi式子中可能是不同体现在机器做乘法的过程中,就是要连通乘数y也一并做右移位(使得乘数的末位就是参与分布乘法的bit)

在这里插入图片描述

模拟机器计算一位原码乘法

  • 0.1101 × 0.1011 \begin{aligned} &&0.1101 \\&\times&0.1011 \end{aligned} ×0.11010.1011

    • 下面的列表计算中,(A=0.1101;B=0.1011)
      • 第1栏为对部分积的操作(包括加法和部分积移位)
        • 假设保存部分积的寄存器为 R x R_x Rx
      • 第2栏为乘数,包括对乘数的移位(调整并保持最后位bit的值是恰好可以用来计算 s i s_i si)
        • 假设保存乘数(以及部分积的低位)的寄存器为 R y R_y Ry
        • B = 0. y 1 y 2 y 3 y 4 B=0.y_1y_2y_3y_4 B=0.y1y2y3y4
        • 那么乘数列第 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4个值的末位分别: y 4 , y 3 , y 2 , y 1 y_4,y_3,y_2,y_1 y4,y3,y2,y1
          • 它们先后被利用完就因为右移被逐个丢弃,右移空出来的高位使用来接纳部分积中的向右移位而被挤出来的位
          • y 1 y_1 y1也被丢弃,那么乘法操作完成(结束)
  • image-20220402161458539

  • 形成的最终结果分布在两个寄存器内

    • 结果的高位部分放在 R 1 R_1 R1
    • 结果的低位部分则位于 R 2 R_2 R2

小结

  • 从递推公式中可以看出,被乘数 x ∗ x^* x视为一个整体
    • 乘数 y ∗ y^* y被分解为2的幂的和的形式下一个部分积(当前计算的部分积 z i z_i zi用到上一个算好的部分积 z i − 1 z_{i-1} zi1)
    • 递推公式告诉我们,计算机内部使用
      • 加法联合移位两种计算机擅长的操作来实现乘法运算(间接)
      • y i ∈ {   0 , 1   } y_i\in\set{0,1} yi{0,1}容易知道, x ∗ ⋅ y i ∈ {   x ∗ , 0   } x^*\cdot{y_i}\in{\set{x^*,0}} xyi{x,0}
      • 如果乘数 y ∗ y^* y有n位,那么该策略共需要进行n次加法操作和n次移位操作
      • 由乘数的末位值(末位bit)t确定被乘数是否与原部分积(上一次计算得到的部分积)相加
        • t=1,则加上被乘数
        • t=0,不加被乘数(加0代替之)
        • 然后右移一位(即乘以 2 − 1 2^{-1} 21),形成新的部分积;
          • 同时,乘数也右移一位,使得次低位新的末位,空出最高位放部分积的最低位
      • 每一轮计算(加操作/移位操作)中,加法计算在前,移位计算在后
        • 每次做加法时,被乘数仅仅与原部分积的高位相加
        • 其低位,被移出到乘数所空出的高位位置(寄存器)
  • 用一个寄存器存放 被乘数,一个寄存器存放 乘积 另一个寄存器 存放 乘数(已经用过的低位乘数不再保留)乘积的低位(就是A*B的总结果的低位)(共用一个寄存器,最终,乘数的各个位都被丢弃,而仅有乘积的较低位部分);
  • 再配上加法器及其他相应电路,就可组成乘法器。
    • 又因加法只在部分积的高位进行,故不但节省了器材,而且还缩短了运算时间。
posted @   xuchaoxin1375  阅读(25)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示