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

  • 相关阅读:
    python读文件指定行的数据
    在linux系统中实现各项监控的关键技术(2)--内核态与用户态进程之间的通信netlink
    在linux系统中实现各项监控的关键技术(1)--cpu使用率的计算
    spring事件驱动模型--观察者模式在spring中的应用
    B2C自营商城的订单设计方案
    RabbitMQ死信队列
    springboot操作rabbitmq
    Rabbitmq--topic
    docker-compose.yml rabbitmq
    运行rabbitmq
  • 原文地址:https://www.cnblogs.com/li-hua/p/5966596.html
Copyright © 2011-2022 走看看