码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-10-16 16:45:33      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

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

设 \(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 即答案。

 

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

标签:

原文地址:http://www.cnblogs.com/li-hua/p/5966596.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!