zoukankan      html  css  js  c++  java
  • 化减为加:十进制的「补码」

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

    设 (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 ight }) )

    则补码 ( 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 ight }) )

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

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

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

    ( = 9cdotfrac{1-10^{n+1}}{1-10} - N + 1 )

    ( = 9cdot 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 即答案。

  • 相关阅读:
    【转载】webDriver拾级而上·之五 iframe的处理
    Linux课程笔记 用户和用户组管理
    Linux课程笔记 文件和目录权限
    Linux课程笔记 软硬链接
    Java算法面试题
    Linux课程笔记 Day09 课上内容总结 MySql,Php的安装及Apache,Nginx,Php的优化
    Day13 高级子查询
    Day12 SET运算符
    Day11 其他数据库对象
    Linux课程笔记 Day08 课上内容总结 Apache,Raid技术及Nginx
  • 原文地址:https://www.cnblogs.com/li-hua/p/5966596.html
Copyright © 2011-2022 走看看