补码一位乘法公式的推导

一、公式及其递推式

  1. 补码一位乘法公式如下:
    [ x ] 补 = x 0 . x 1 x 2 . . . x n [ y ] 补 = y 0 . y 1 y 2 . . . y n [ x ⋅ y ] 补 = [ x ] 补 ⋅ ( − y 0 + ∑ i = 1 n y i 2 − i ) \begin {array}{ll} [x]_{补}&=x_{0}.x_{1}x_{2}...x_{n}\\ [y]_{补}&=y_{0}.y_{1}y_{2}...y_{n}\\ [x·y]_{补}&=[x]_{补}·(-y_{0}+\sum\limits_{i=1}^{n}y_{i}2^{-i})\\ \end {array} [x][y][xy]=x0.x1x2...xn=y0.y1y2...yn=[x](y0+i=1nyi2i)
  2. 对上式进行变换:
    [ x ⋅ y ] 补 = [ x ] 补 ⋅ ( − y 0   + y 1 2 − 1 + y 2 2 − 2     + . . . + y n 2 − n ) = [ x ] 补 ⋅ [ − y 0    + ( y 1 − y 1 2 − 1 ) + ( y 2 2 − 1 − y 2 2 − 2 ) + . . . + ( y n 2 − ( n − 1 ) − y n 2 − n ) ] = [ x ] 补 ⋅ [ ( y 1 − y 0 )      + ( y 2 − y 1 ) 2 − 1     + . . . +   ( y n − y n − 1 ) 2 − ( n − 1 ) + ( y n + 1 − y n ) 2 − n ] ( 其 中 y n + 1 = 0 ) = [ x ] 补 ⋅ ∑ i = 1 n ( y i + 1 − y i ) 2 − i \begin {array}{ll} [x·y]_{补}&=[x]_{补}·(-y_{0}\,+y_{1}2^{-1}\qquad\quad+y_{2}2^{-2}\qquad\qquad\ \,+...+y_{n}2^{-n})\\ &=[x]_{补}·[-y_{0}\;+(y_{1}-y_{1}2^{-1})+(y_{2}2^{-1}-y_{2}2^{-2})+...+(y_{n}2^{-(n-1)}-y_{n}2^{-n})]\\ &=[x]_{补}·[(y_1 - y_0)\ \ \,+(y_2 - y_1)2^{-1}\quad\ \ \ +...+\ (y_{n}-y_{n-1})2^{-(n-1)}+(y_{n+1}-y_{n})2^{-n}]&\qquad(其中y_{n+1}=0)\\ &=[x]_{补}·\sum\limits_{i=1}^{n}(y_{i+1}-y_{i})2^{-i} \end {array} [xy]=[x](y0+y121+y222 +...+yn2n)=[x][y0+(y1y121)+(y221y222)+...+(yn2(n1)yn2n)]=[x][(y1y0)  +(y2y1)21   +...+ (ynyn1)2(n1)+(yn+1yn)2n]=[x]i=1n(yi+1yi)2i(yn+1=0)
  3. 所以递推公式如下:
    [ z 0 ] 补 = 0 [ z 1 ] 补 = 2 − 1 { [ z 0 ] 补 + ( y n + 1 − y n ) [ x ] 补 } ( 其 中 y n + 1 = 0 ) . . . [ z i ] 补 = 2 − 1 { [ z i − 1 ] 补   + ( y n − i + 2 − y n − i + 1 ) [ x ] 补 } . . . [ z n ] 补 = 2 − 1 { [ z n − 1 ] 补 + ( y 2 − y 1 ) [ x ] 补 } [ z n + 1 ] 补 = [ z n ] 补       + ( y 1 − y 0 ) [ x ] 补 = [ x ⋅ y ] 补 \begin {array}{lll} [z_{0}]_{补}&=0\\ [z_{1}]_{补}&=2^{-1}\{[z_0]_{补}\quad+(y_{n+1}-y_{n})[x]_{补}\}&(其中y_{n+1}=0)\\ &...\\ [z_{i}]_{补}&=2^{-1}\{[z_{i-1}]_{补}\,+(y_{n-i+2}-y_{n-i+1})[x]_{补}\}\\ &...\\ [z_{n}]_{补}&=2^{-1}\{[z_{n-1}]_{补}+(y_2 - y_1)[x]_{补}\}\\ [z_{n+1}]_{补}&=\qquad[z_n]_{补}\ \ \ \,+(y_1 - y_0)[x]_{补}&=[x·y]_{补}\\ \end {array} [z0][z1][zi][zn][zn+1]=0=21{[z0]+(yn+1yn)[x]}...=21{[zi1]+(yni+2yni+1)[x]}...=21{[zn1]+(y2y1)[x]}=[zn]   +(y1y0)[x](yn+1=0)=[xy]

二、公式的证明

  1. y ≥ 0 y\geq0 y0时有:(注意以下都是模为2的运算,所以2的公倍数都等价于2)
    [ x ⋅ y ] 补 = 2 + x ⋅ y = 2 n + 1 + x ⋅ y = 2 n + 1 ⋅ y + x ⋅ y ( 其 中 y = 0. y 1 y 2 . . . y n , 所 以 2 n + 1 ⋅ y = y 1 y 2 . . . y n 0.0 ) = ( 2 n + 1 + x ) ⋅ y ( 因 为 2 n + 1 ⋅ y % 2 = 0 ) = ( 2 + x ) ⋅ y = [ x ] 补 ⋅ y \begin {array}{rll} [x·y]_{补}&=2+x·y\\ &=2^{n+1}+x·y\\ &=2^{n+1}·y+x·y\qquad &(其中y=0.y_1y_2...y_n,所以2^{n+1}·y=y_1y_2...y_n0.0)\\ &=(2^{n+1}+x)·y &(因为2^{n+1}·y\%2=0)\\ &=(2+x)·y\\ &=[x]_{补}·y\\ \end {array} [xy]=2+xy=2n+1+xy=2n+1y+xy=(2n+1+x)y=(2+x)y=[x]y(y=0.y1y2...yn2n+1y=y1y2...yn0.0)(2n+1y%2=0)
  2. y < 0 y<0 y<0时有:
    ∵ [ y ] 补 = 2 + y ∴ y = [ y ] 补 − 2 = ( 1. y 1 y 2 . . . y n ) − 2 = ( 0. y 1 y 2 . . . y n ) − 1 ∴ x ⋅ y = x ⋅ ( 0. y 1 y 2 . . . y n ) − x ∴ [ x ⋅ y ] 补 = [ x ⋅ ( 0. y 1 y 2 . . . y n ) − x ] 补 = [ x ⋅ ( 0. y 1 y 2 . . . y n ) ] 补 − [ x ] 补 ( 其 中 [ − x ] 补 = − [ x ] 补 ) 又 ∵ ( 0. y 1 y 2 . . . y n ) ≥ 0 , 且 y ≥ 0 时 有 [ x ⋅ y ] 补 = [ x ] 补 ⋅ y ∴ [ x ⋅ ( 0. y 1 y 2 . . . y n ) ] 补 = [ x ] 补 ⋅ ( 0. y 1 y 2 . . . y n ) ∴ [ x ⋅ y ] 补 = [ x ] 补 ⋅ ( 0. y 1 y 2 . . . y n ) − [ x ] 补 \begin {array} {l} \because [y]_{补}=2+y\\ \therefore y=[y]_{补}-2=(1.y_1y_2...y_n)-2=(0.y_1y_2...y_n)-1\\ \therefore x·y=x·(0.y_1y_2...y_n)-x\\ \therefore [x·y]_{补}=[x·(0.y_1y_2...y_n)-x]_{补}=[x·(0.y_1y_2...y_n)]_{补}-[x]_{补} \qquad(其中[-x]_{补}=-[x]_{补})\\ 又\because (0.y_1y_2...y_n)\geq 0,且y\geq 0时有[x·y]_{补}=[x]_{补}·y\\ \therefore [x·(0.y_1y_2...y_n)]_{补}=[x]_{补}·(0.y_1y_2...y_n)\\ \therefore [x·y]_{补}=[x]_{补}·(0.y_1y_2...y_n)-[x]_{补}\\ \end {array} [y]=2+yy=[y]2=(1.y1y2...yn)2=(0.y1y2...yn)1xy=x(0.y1y2...yn)x[xy]=[x(0.y1y2...yn)x]=[x(0.y1y2...yn)][x]([x]=[x])(0.y1y2...yn)0y0[xy]=[x]y[x(0.y1y2...yn)]=[x](0.y1y2...yn)[xy]=[x](0.y1y2...yn)[x]
  3. 综合上面1、2两点可得:
    [ x ⋅ y ] 补 = [ x ] 补 ⋅ ( 0. y 1 y 2 . . . y n ) − [ x ] 补 ⋅ y 0 = [ x ] 补 ⋅ [ − y 0 + ( 0. y 1 y 2 . . . y n ) ] = [ x ] 补 ⋅ ( − y 0 + ∑ i = 1 n y i 2 − i ) 证 毕 . \begin {array} {rl} [x·y]_{补}&=[x]_{补}·(0.y_1y_2...y_n)-[x]_{补}·y_0\\ &=[x]_{补}·[-y_0+(0.y_1y_2...y_n)]\\ &=[x]_{补}·(-y_{0}+\sum\limits_{i=1}^{n}y_{i}2^{-i})\qquad证毕. \end {array} [xy]=[x](0.y1y2...yn)[x]y0=[x][y0+(0.y1y2...yn)]=[x](y0+i=1nyi2i).

三、附加证明

接下来来证明 [ − x ] 补 = − [ x ] 补 [-x]_{补}=-[x]_{补} [x]=[x]

  1. x x x为纯小数时:
    − 1 ≤ x < 0 时 , [ − x ] 补 = − x = − 2 − x = − ( 2 + x ) = − [ x ] 补 ; 0 ≤ x < 1 时 ,       [ − x ] 补 = 2 + ( − x ) = − x = − [ x ] 补 。 \begin {array} {l} -1 \le x <0时,[-x]_{补}=-x=-2-x=-(2+x)=-[x]_{补};\\ 0 \le x <1时,\ \ \;[-x]_{补}=2+(-x)=-x=-[x]_{补}。\\ \end {array} 1x<0[x]=x=2x=(2+x)=[x];0x<1  [x]=2+(x)=x=[x]
  2. x x x为纯整数时:
    − 2 n ≤ x ≤ 0 时 , [ − x ] 补 = − x = − 2 n + 1 − x = − ( 2 n + 1 + x ) = − [ x ] 补 ; 0 ≤ x < 2 n 时 ,     [ − x ] 补 = 2 n + 1 + ( − x ) = − x = − [ x ] 补 。 \begin {array} {l} -2^n \le x \le 0时,[-x]_{补}=-x=-2^{n+1}-x=-(2^{n+1}+x)=-[x]_{补};\\ 0 \le x <2^n时,\ \ \ [-x]_{补}=2^{n+1}+(-x)=-x=-[x]_{补}。\\ \end {array} 2nx0[x]=x=2n+1x=(2n+1+x)=[x];0x<2n   [x]=2n+1+(x)=x=[x]
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值