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

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

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

时间: 2024-10-12 21:06:48

化减为加:十进制的「补码」的相关文章

「模板」 线段树——区间乘 && 区间加 && 区间求和

「模板」 线段树--区间乘 && 区间加 && 区间求和 <题目链接> 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long long p; class SegmentTree { private: struct Node { int l,r; long long v,mul,add; Node *c[2]; Node(int l,int r):l(l),r(r),mul(1LL),add(0LL) { c[

「MoreThanJava」计算机发展史—从织布机到IBM

「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 不论新老朋友 我相信您都可以 从中获益.如果觉得 「不错」 的朋友,欢迎 「关注 + 留言 + 分享」,文末有完整的获取链接,您的支持是我前进的最大的动力! 一.织布机 | 一切的开端 如今代表智能现代的计算机与老式织布机的血缘关系超乎你的想象.无论是摆在写字台上的 台式机.塞在口袋里的 掌上电脑.

大数据和「数据挖掘」是何关系?---来自知乎

知乎用户,互联网 244 人赞同 在我读数据挖掘方向研究生的时候:如果要描述数据量非常大,我们用Massive Data(海量数据)如果要描述数据非常多样,我们用Heterogeneous Data(异构数据)如果要描述数据既多样,又量大,我们用Massive Heterogeneous Data(海量异构数据)--如果要申请基金忽悠一笔钱,我们用Big Data(大数据) 编辑于 2014-02-2817 条评论感谢 收藏没有帮助举报作者保留权利 刘知远,NLPer 4 人赞同 我觉得 大数据

将 QQ 音乐、网易云音乐和虾米音乐资源「整合」一起的Chrome 扩展Listen 1

原文地址:http://whosmall.com/?post=418 本文标签: Chrome扩展 Chrome浏览器 Chrome扩展Listen1 音乐资源整合 Listen1安装方法 在 Chrome 上安装了这款名为 Listen 1 的插件,妈妈可是再也不用担心你找不到想听的歌了.它将 QQ 音乐.网易云音乐以及虾米音乐的音乐资源「整合」在了一起,你只需要输入音乐关键词,就可以方便地三大曲库中跳转搜索. 安装方法 Listen 1 的安装方法与一般的 Chrome Extension

tyvj P2018 「Nescaf&#233;26」小猫爬山 解题报告

P2018 「Nescafé26」小猫爬山 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). 描述 Freda和rainbow只好花钱让它们坐索道下山.索道上的缆车最大承重量为W,而N只小猫的重量分别是C1.C2……CN.当然,每辆缆车上的小猫的重量之和不能超过W.每租用一辆缆车,Freda和rainb

laravel4 「时间戳」问题

默认 Eloquent 会自动维护数据库表的 created_at 和 updated_at 字段.只要把这两个「时间戳」字段加到数据库表, Eloquent 就会处理剩下的工作.如果不想让 Eloquent 自动维护这些字段,把下面的属性加到模型类里: 关闭自动更新时间戳 class User extends Eloquent { protected $table = 'users'; public $timestamps = false; } 自定义时间戳格式 如果想要自定义时间戳格式,可以

「译」JavaScript 的怪癖 1:隐式类型转换

原文:JavaScript quirk 1: implicit conversion of values 译文:「译」JavaScript 的怪癖 1:隐式类型转换 译者:justjavac 零:提要 [此贴子是 javascript 的 12 个怪癖(quirks) 系列的第一篇.] JavaScript 是非常宽容的,「来者不拒」,不在乎什么类型. 例如,它如果想要接受数字,它并不拒绝其他类型的值,而是试图把它们转换成数字: > '5' - '2' 3 > '5' * '2' 10 自动转

程序员「奇葩」说

一直以来「奇葩」这个词都是偏贬义的,直到去年有个综艺节目叫「奇葩说」挺热闹,这里的人不一定是奇葩,更多指达人的意思. 「奇葩说」里的达人都是能说会道的,我的主业是程序员,所以只能写写在我职业生涯中碰到的一些「奇葩」程序员. 你懂的,我这里的「奇葩」没有任何贬义的意思. 月在胸襟人在途 我刚入行时的第一位项目经理,70后.那年三十出头,在银行客户现场做项目经理,负责一个二十来人的客户现场团队. 虽然他的职位是项目经理,但实际那时他真是一名地道的资深程序员. 70 后的程序员大都是从写 C 开始的,

Linux 小知识翻译 - 「模块」

说起module(模块),有的像「可热插拔的零部件」的意思. 在讨论Linux时提到的模块一般是指可以组装到内核中的模块. 模块这个概念是在硬件和程序设计领域中广泛使用的概念.我们这次说的模块特指Linux内核中的模块. 内核模块简单来说就是「作为内核程序主体的一个小配件来使用的程序」,也就是说,只有模块是什么也做不了的.安装到内核中才能起作用. 比如有一个新的设备或者一个新的功能想要追加到内核中时,就可以用模块的方式来实现.(设备驱动最好考虑用内核模块的方式来提供) 此时,如果把相应的模块直接