化减为加:十进制的「补码」

补码把减法变加法的原理其实就是同余。

设 \(n+1\) 位二进制数 \( N = \overline{x_n \cdots x_2x_1x_0} \)

\( N = x_0+2x_1+2^{2}x_2+\cdots+2^{n}x_n \;\;\;\; (x_i \in \left\{ 0,1 \right \}) \)

则补码 \( N' = (1-x_0)+2(1-x_1)+2^{2}(1-x_2)+\cdots+2^{n}(1-x_n) + 1 \)

\( = 1+2+2^2+\cdots+2^n - (x_0+2x_1+2^{2}x_2+\cdots+2^{n}x_n) + 1 \)

\( = 1+2+2^2+\cdots+2^n - N + 1 \)

\( = \frac{1-2^{n+1}}{1-2}-N + 1 \)

\( = 2^{n+1}-1-N + 1 = 2^{n+1}-N \equiv -N \;\; (\mathrm{mod}\;\;2^{n+1}) \)

即,对于 \(n+1\) 位二进制数 \(N\), 有:

\( N' \equiv -N \;\; (\mathrm{mod}\;\;2^{n+1}) \)

 所以在模 \( 2^{n+1} \) 的情况下,加上补码 \( \overline{(1-x_n)\cdots(1-x_2)(1-x_1)(1-x_0)}+1 \) 的效果和做减法是一样的。

那么对于十进制,就可以照葫芦画瓢:

设 \(n+1\) 位十进制数 \( N = \overline{x_n \cdots x_2x_1x_0} \)

\( N = x_0+10x_1+10^{2}x_2+\cdots+10^{n}x_n \;\;\;\; (x_i \in \left\{ 0,1,2,\cdots,9 \right \}) \)

令 \( N' = (9-x_0)+10(9-x_1)+10^{2}(9-x_2)+\cdots+10^{n}(9-x_n) + 1 \)

则 \( N' = 9+9\cdot 10 + 9\cdot 10^2 + \cdots + 9\cdot 10^n - (x_0+10x_1+10^{2}x_2+\cdots+10^{n}x_n) + 1 \)

\( = 9\cdot (1+10+10^2+\cdots+10^n) - N + 1 \)

\( = 9\cdot\frac{1-10^{n+1}}{1-10} - N + 1 \)

\( = 9\cdot \frac{10^{n+1}-1}{9} -N + 1 \)

\( = 10^{n+1}-1-N + 1 = 10^{n+1}-N \equiv -N \;\; (\mathrm{mod}\;\;10^{n+1}) \)

也就是说,对于十进制也有类似结论:

\( N' = \overline{(9-x_n)\cdots(9-x_2)(9-x_1)(9-x_0)}+1 \equiv -N \;\; (\mathrm{mod}\;\;10^{n+1}) \)

举个例子,要计算 9912-6543, 先求出 6543 的「补码」\( \overline{(9-6)(9-5)(9-4)(9-3)}+1 \) 即 3457, 然后计算 9912+3457 = 13369, 再模 10000 ( 即舍去进到万位的 1 ), 得到 3369 即答案。

 

posted @ 2016-10-16 15:17  Li_Hua  阅读(1437)  评论(0编辑  收藏  举报