计组_原码一位乘法
原码一位乘法:
笔算乘法
例
- 乘法A*B转换为关于A的若干次移位和加法(怎么移位的由乘数B的各个位来决定)
- 简单的加法运算(而且每次加法总是有一个操作数取值为A(或者0)(也就是被乘数或者0参与和
此次加法前得到的部分积
的加法运算操作))
- 从上面的加法/移位交替计算的过程中可以看到,加法结果每次移位,蓝绿色区域内的数就会增加一位,这些位都将作为最终的的’‘乘法’'结果的低位
- 他们不受后续高位计算的影响而改变数值(但是仍然参与移位)
-
上述演算中,可以看到,得到最终结果的过程中,低位是最早被确定的
-
而且不受后续高位结果位的影响
-
各层部分积的低位随着计算的进行,逐渐被作为总结果的低位而确定下来
- 总结果的低位部分和早期计算的部分积的低位是一致的
-
-
既然部分积的最低位最早可以确定,那么将这一位保存到合适的位置后(即最终结果的最低位开始)),
就可以将原先保存乘数的寄存器的低位用于存放别的数据(譬如新的部分积)
-
笔算乘法的改进
-
∑ 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=p∑nxir−i=r−qi=p∑nxirq−ip=q=1时:i=1∑nxir−i=r−1(i=1∑nxir1−i)=r−1(x1+i=2∑nxir1−i)=r−1(x1+r−1(x2+i=3∑nxir2−i))=r−1(x1+r−1(x2+⋯r−1(xn−1+i=n∑nxir(n−1)−i)))=r−1(x1+r−1(x2+⋯r−1(xn−1+r−1(xn+0))))i=1∑nxir−i=r−1(x1+r−1(x2+⋯r−1(xn−1+r−1(xn+0))))Ki=1∑nxir−i=Kr−1(x1+r−1(x2+⋯r−1(xn−1+r−1(xn+0))))=r−1(Kx1+r−1(Kx2+⋯r−1(Kxn−1+r−1(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=1∑nxi2−i=2−1(x1+2−1(x2+⋯2−1(xn−1+2−1(xn+0))))Ki=1∑nxir−i=2−1(Kx1+2−1(Kx2+⋯2−1(Kxn−1+2−1(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=p∑nyir(p−1)−i=r−1i=p∑nyir(p)−i=r−1(yp+i=p+1∑nyirp−i)二进制数移位形式的递推:i=p∑nyi2(p−1)−i=2−1i=p∑nyi2(p)−i=2−1(yp+i=p+1∑nyi2p−i)
-
以小数为例 : 设 , 有真值 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.x1x2⋯xnT(y)=y0.y1y2⋯ynx∗=∣x∣=0.x1x2⋯xny∗=∣y∣=0.y1y2⋯ynxi,yi∈{0,1}T(x)T(y)=x0⊕y0.(0.x1x2⋯xn)(0.y1y2⋯yn)
-
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=x∗⋅y∗=x∗⋅i=1∑nyi2−i=x∗(2−1(x∗y1+2−1(x∗y2+⋯2−1(x∗yn−1+2−1(x∗yn+0)))))为了便于描述:记部分积为{si=yn−(i−1)⋅x∗+zi−1zi=2−1si=2−1(yn−(i−1)⋅x∗+zi−1);(i∈0,1,⋯,n)♣则:zi=2−1si(可见,zi可以由si直接右移1位得到)对于机器计算si时,要先执行乘数的移位(在表格法中,这个移位操作伴随着zi−1的右移一起右移)以便得到对应的乘数bit:yn−(i−1);然后在执行加法操作(+zi−1),得到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=2−1s1=2−1(x∗yn+z0))z2=2−1s2=2−1(x∗yn−1+z1))⋮zn=2−1sn=2−1(x∗y1+zn−1))可见S=x∗⋅y∗=zn;🎈RHS(等式右边),y的下标和z的下标之和为n♠再强调一下取值范围的事:♣xi,yi∈{0,1}这意味着,虽然递推式中包含了乘法的形式(x∗yj,但实际上计算机执行的是加x∗或者加0即可用表格模拟上述策略,可以列出z0∼zn共n+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每一个式子就是一轮操作(加法操作和移位操作的先后执行)再比较这些式子,它们在形式(结构上是一样的),不变的元素是因子2−1(表示向右移位);x∗yj中yj不像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也被丢弃,那么乘法操作完成(结束)
- 第1栏为对部分积的操作(包括加法和部分积移位)
- 下面的列表计算中,(A=0.1101;B=0.1011)
-
-
形成的最终结果分布在两个寄存器内
- 结果的高位部分放在 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} zi−1)
- 递推公式告诉我们,计算机内部使用
- 加法联合移位两种计算机擅长的操作来实现乘法运算(间接)
- 由 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}} x∗⋅yi∈{x∗,0}
- 如果乘数 y ∗ y^* y∗有n位,那么该策略共需要进行n次加法操作和n次移位操作
- 由乘数的末位值(末位bit)t确定被乘数是否与原部分积(上一次计算得到的部分积)相加
- t=1,则加上被乘数
- t=0,不加被乘数(加0代替之)
- 然后右移一位(即乘以
2
−
1
2^{-1}
2−1),形成新的部分积;
- 同时,乘数也右移一位,使得次低位作新的末位,
空出最高位放部分积的最低位
- 同时,乘数也右移一位,使得次低位作新的末位,
- 每一轮计算(加操作/移位操作)中,加法计算在前,移位计算在后
- 每次做加法时,被乘数仅仅与原部分积的高位相加
- 其低位,被移出到乘数所空出的高位位置(寄存器)
- 用一个寄存器存放
被乘数
,一个寄存器存放乘积
另一个寄存器 存放乘数(已经用过的低位乘数不再保留)
及乘积的低位(就是A*B的总结果的低位)
(共用一个寄存器,最终,乘数的各个位都被丢弃,而仅有乘积的较低位部分); - 再配上加法器及其他相应电路,就可组成乘法器。
- 又因加法只在部分积的
高位
进行,故不但节省了器材,而且还缩短了运算时间。
- 又因加法只在部分积的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」