一、公式及其递推式
- 补码一位乘法公式如下:
[ 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]补[x⋅y]补=x0.x1x2...xn=y0.y1y2...yn=[x]补⋅(−y0+i=1∑nyi2−i) - 对上式进行变换:
[ 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} [x⋅y]补=[x]补⋅(−y0+y12−1+y22−2 +...+yn2−n)=[x]补⋅[−y0+(y1−y12−1)+(y22−1−y22−2)+...+(yn2−(n−1)−yn2−n)]=[x]补⋅[(y1−y0) +(y2−y1)2−1 +...+ (yn−yn−1)2−(n−1)+(yn+1−yn)2−n]=[x]补⋅i=1∑n(yi+1−yi)2−i(其中yn+1=0) - 所以递推公式如下:
[ 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=2−1{[z0]补+(yn+1−yn)[x]补}...=2−1{[zi−1]补+(yn−i+2−yn−i+1)[x]补}...=2−1{[zn−1]补+(y2−y1)[x]补}=[zn]补 +(y1−y0)[x]补(其中yn+1=0)=[x⋅y]补
二、公式的证明
- 当
y
≥
0
y\geq0
y≥0时有:(注意以下都是模为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} [x⋅y]补=2+x⋅y=2n+1+x⋅y=2n+1⋅y+x⋅y=(2n+1+x)⋅y=(2+x)⋅y=[x]补⋅y(其中y=0.y1y2...yn,所以2n+1⋅y=y1y2...yn0.0)(因为2n+1⋅y%2=0) - 当
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+y∴y=[y]补−2=(1.y1y2...yn)−2=(0.y1y2...yn)−1∴x⋅y=x⋅(0.y1y2...yn)−x∴[x⋅y]补=[x⋅(0.y1y2...yn)−x]补=[x⋅(0.y1y2...yn)]补−[x]补(其中[−x]补=−[x]补)又∵(0.y1y2...yn)≥0,且y≥0时有[x⋅y]补=[x]补⋅y∴[x⋅(0.y1y2...yn)]补=[x]补⋅(0.y1y2...yn)∴[x⋅y]补=[x]补⋅(0.y1y2...yn)−[x]补 - 综合上面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} [x⋅y]补=[x]补⋅(0.y1y2...yn)−[x]补⋅y0=[x]补⋅[−y0+(0.y1y2...yn)]=[x]补⋅(−y0+i=1∑nyi2−i)证毕.
三、附加证明
接下来来证明 [ − x ] 补 = − [ x ] 补 [-x]_{补}=-[x]_{补} [−x]补=−[x]补:
-
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} −1≤x<0时,[−x]补=−x=−2−x=−(2+x)=−[x]补;0≤x<1时, [−x]补=2+(−x)=−x=−[x]补。 -
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} −2n≤x≤0时,[−x]补=−x=−2n+1−x=−(2n+1+x)=−[x]补;0≤x<2n时, [−x]补=2n+1+(−x)=−x=−[x]补。