编码:实现减法

作者&投稿:调荷 (若有异议请与网页底部的电邮联系)
~

   本文是基于《编码》、《穿越计算机的迷雾》两部著作进行读后整理的记录性博客。对书中较为重要的内容进行归纳整理进行二次创作,略去了繁琐的讲述细节,力求简明扼要。

  加法和减法在某些方面相互补充,但在机制方面这两个运算则是不同的。加法是始终从两个加数的最右列向最左列进行计算的。每一列的进位加到下一列中。在减法中没有进位,而是有借位——一种与加法存在本质区别的麻烦机制。

  要解决这个问题,首先从最右列着手。我们看到,6 是大于 3 的,因此从 5 上借 1,再用 13 减去 6,得到结果为 7。由于我们已经在 5 上借了 1,因此,现在实际上那一位是 4,而 4 是小于 7 的,因此继续从 2 上借 1,14 减 7 结果为 7。而由于在 2 上借了 1,实际上这一位是 1,从中减去 1,结果为 0。因此,最后的结果应为 77。

  如何才能通过一连串逻辑门来实现这个反逻辑呢?

  然而,我们并不打算这样做。相反,我们打算用一个小技巧来让减法不涉及借位。为了避免借位,首先要从 999 中减去减数,而不是从原来的被减数中减去减数。从一串 9 中减去一个数叫做对 9 求补数。176 对 9 的补数是 823。

  计算出减数对 9 的补数后,将补数与原来的被减数相加:

  最后再将结果加 1,并减去 1000。

  到此,我们就得到了结果。答案与先前的相同,而且没有用到借位。

  我们按照前面的步骤梳理一下计算过程。原题目是这样的:

  这个式子于下面的式子等价:

  我们用两个减法和两个加法来替代一个减法,而在这个过程中避免了烦琐的借位。

  如果减数大于被减数会怎么样呢?例如以下问题:

  如果希望求解这个问题而不使用借位的话,就要采用与之前稍微不同的方法。首先要像前面一样,用 999 减去减数 253,计算出对 9 的补数:

  把该数对 9 的补数与被减数相加:

  在前面的例子中,下一步应该加 1,并减去 1000 来得到最终结果。但是在这里,这种方法并不适用。因为你会遇到 923 减去 1000 的情况,这又导致了借位。由于我们之前已经加了 999,这里再减去 999:

  到这里,我们会意识到这个问题的结果是负数,因此需要将减数与被减数交换,用 999 减去 922(也即改成 999 - 922,结果加上负号)。这里没有用到借位,结果与我们期望的相同:

  同样我们来回顾总结一下上述的计算过程。原题目是这样的:

  这个式子于下面的式子等价:

  同样的技巧可以用于二进制数中,而且实际上这要比十进制数简单。

  将上面提到的 254 - 176 转化为二进制数进行计算,那么问题变为:

  同样的,求补数:

  在求对 1 的补数时,只需将原来的二进制数中的 1 变为 0,将 0 变为 1 即可。因此对 1 求补数有时也会称为相反数(negation)或反码(inverse)。在前面的内容中我们介绍过反向器,它的作用就是将 0 变为 1,将 1 变为 0。

  将减数对 1 的补数与被减数相加:

  将上式所得结果加 1,减去 100000000(即 256):

  我们把这两个数颠倒位置后再做一遍。在十进制中,减法题目对应于 176 - 253。而用二进制表示为:

  计算过程如下,最后计算结果加上负号:

  了解了上述计算技巧后,我们可以开始尝试实现一下减法的操作。下面构建的减法器适用于计算结果为正数的减法操作。

  针对求补数的计算过程,二进制数对1求补数相当于对其每位取反,因此我们可以利用反向器来实现相应的操作。以 8 为二进制减法为例,我们计算 8 位二进制数补数的时候可以简单地应用 8 个反向器。

  问题是,该电路只会对输入求反,而我们要的是一台既能做加法又能做减法的机器,因此就要求该电路当且仅当进行减法运算时才实现反转。电路可以改造为如下图所示。

  标记为 “取反” 的信号将被输入到每一个异或门中。回想一下异或门的工作方式,如下表所示。

  因此,如果 “取反” 信号是 0,则 8 个异或门输出与输入相同。例如,如果输入是 01100001,那么输出也为 01100001。如果 “取反” 信号为 1,则输出信号反置。例如,如果输入为 01100001,输出则为 10011110。

  将 8 个异或门合并起来画成一个器件,称为求补器(One’sComplement),如下所示。

  将一个求补器,一个 8 位二进制加法器和一个异或门做如下连接。

  注意,这里三个信号都标识为 “SUB”,这就是加/减法转换开关。当该信号为 0 的时候,其进行的是加法运算,为 1 时进行的则是减法运算。在减法中,输入 B(第二排开关)在送入加法器之前,需先通过求补电路进行取反。此外,在做减法时,我们通过设定 CI(进位输入)为 1 来使得结果加 1。而在加法中,求补电路将不起作用,且输入 CI 为 0。

  加法器的 SUB 信号和 CO(进位输出)输出作为异或门的输入来控制表示上溢/下溢的灯泡。如果 SUB 信号为 0(表示进行加法运算),则当加法器 CO 输出为 1 时灯亮,意思是加法计算结果大于 255。

  当进行减法运算的时候,如果减数(输入 B)小于被减数(输入 A),这时加法器的 CO 输出为 1。这表示减法的最后一步要减去 100000000。也就是说减数要大于被减数,结果为负。上面所示器件现在还不能表示负数。因此,上溢/下溢指示灯仅在加法器的 CO 输出为 0 时才会亮起。

  编码:实现减法篇对二进制加法器部分进行了拓展,讨论了如何利用全加器实现了二进制的减法操作。为了精简内容删减了部分较为详细的书写,仅作为整理总结。




BCD码的加减法
当两个BCD码相加,如果和等于或小于 1001(即十进制数9),不需要修正;如果相加之和在 1010 到1111(即十六进制数 0AH~0FH)之间,则需加 6 进行修正;如果相加时,本位产生了进位,也需加 6 进行修正。这样做的原因是,机器按二进制相加,所以 4 位二进制数相加时,是按“逢十六进一”的原则...

关于王爽的汇编语言的加减乘除指令
BCD码运算结果进入或跳过无效码区时,都会出现错误。为了得到正确结果,必须进行调整。8086\/8088针对压缩BCD码和非压缩BCD码,分别设有两组十进制调整指令,其调整方法略有不同。(1) 压缩BCD码十进制调整指令指令格式:加法十进制调整DAA;(AL)←把AL中的和调整到压缩BCD码格式 减法十进制调整DAS;(...

cpu是怎么做加法和减法的?
计算机的运算普遍采用的都是补码,采用补码的优势是可以将减法转化为加法,这样可以使用加法器实现减法,降低电路复杂度,提高计算效率。另外使用补码也可以避免+\/- 0的问题 如-1+3二进制表示则为 10000001 00000011 --- 取反码则为 11111110 00000011 --- 取补码则为 11111111 00000011 --- 00000010...

二进制的减法是什么原理?
A-B运算转化成[A]补+[-B]补运算,求补过程由B+1来实现。2、全加器的起始进位输入端被连接到功能方式线M上,作减法时M=1,相当于在加法器的最低位上加1。另外,还表示出单符号位法的溢出检测逻辑;当Cn=Cn-1时,运算无溢出;而当Cn≠Cn-1时,运算有溢出,经异或门产生溢出信号。

如何用ARM汇编指令写出实现96位加法和96位减法的代码段!
.global _start .text .arm _start:MOV R0,#0x10 MOV R1,#0x1000000A MOV R2,#0x00 MOV R3,#0x9000000D @ 给第一个128位数赋初值 MOV R4,#0x10 MOV R5,#0x1000000A MOV R6,#0x00 MOV R7,#0x9000000D @ 给第二个128位数赋初值 ADDS R0,R4,R0 @ 最低32位相加,结果保存...

二进制用补码做加减法怎么实现,举个例子??
正数的补码是原码;负数的补码是符号位(最高位)不变,其余位按位取反加1.用补码做减法运算时,结果出现的情况有正、0、负:结果为正或者0时,补码是原码,直接转换成10进制即可;结果为负时,需要将结果减1再保持符号位不变按位取反。例如:1的原码是0000 0001,补码也是0000 0001 -2的原码是...

关于加法和减法在计算机中的原理实现? 比如 3+2 和 3-2 这两个计算式...
加法就是加法,计算机里面只做加法。所以加法就是直接的加法。3+2 = (11)二进制+ (10)二进制= (100)二进制 = 5 减法比较复杂,减法可以看成负数的加法。也就是加上一个数的补码。例如3 - 2 = 3 + (-2)而要得到-2,就要求2的补码。假设你的字长是4位,那 2 = 0010。2的补码就是2...

计算机中原码,补码,反码,是什么?
原码:就是原码,真实的码 反码:在原码的基础上,符号位不变,数值位按位取反 补码:1)正数的补码:与原码相同。【例1】+9的补码是00001001。(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反然后整个数加1。

原码的减法
你想想102-29,减的时候是怎么借位的,0被借位之后变成了什么。借一位就是加10,二进制就是加2,如果向"0"借位,待会0(已经是-1了)向1借位的时候,就变成9,而不是10,(二进制就是0变成2-1,而不是2)。13-7,即1101减0111,得0110,即6,验证正确 ...

java 用字符串实现加减法 包括两位小数 金额格式化 可以为正负 跪求...
只写一个加法的部分的核心代码,其他类似:public String calculateAdd( String a,String b)throws Exception{ double a=Double.parseDouble(a);double b=Double.parseDouble(b);double result=a+b;NumberFormat nf2 = NumberFormat.getInstance(Locale.GERMAN); \/\/ 得到德国的格式 ,这里可以设置不 \/...

工农区18382182576: 单片机msc - 51中编程实现两个一字节压缩型BCD码的减法 -
于剂必仙: ORG 8000H DSUB:MOV R0,#SS ;置被减数指针 MOV R1,#SD ;置减数指针 MOV R7,#N ;置循环次数 CLR C ;置进位标志CY=1 CLR A ;累加器清0 NEXT: ADDC A,#9AH ; 99十1=100(9A) SUBB A,@R1 ;100一减数,得减数补 ADD A,@R0 ;被减数加减数补 DA A ;十进制调整 MOV @R0,A ;存结果 INC R0 ;修改指针 INC R1 DJNZ R7,NEXT ;未完,继续 SS: DB 75H,38H,06H······ SD: DB 41H,24H,17H······ N: EQU SD一SS END

工农区18382182576: 如何实现两个1位8421bcd码的减法 -
于剂必仙: 二进制编码的十进制数,简称bcd码(binarycoded decimal). 这种方法是用4位二进制码的组合代表十进制数的0,1,2,3,4,5,6 ,7,8,9 十个数符.4位二进制数码有16种组合,原则上可任选其中的10种作为代码,分别代表十进制中的0,1,2,3,4,5,6,7,8...

工农区18382182576: 用tec2000机指令编写一个字的bcd码的减法 -
于剂必仙: 十进制数减法调整指令DAS(Decimal Adjust After Subtraction) 该指令于调整AL的值,该值是由指令SUB或SBB运算两个压缩型BCD码所得到的结果.其调整规则如下:如果AL的低四位大于9,或标志位AF=1,那么,AL=AL-6,并置AF=1;如...

工农区18382182576: 实现简单加减法代码 -
于剂必仙: class Person {private String name;private int age; Person(String n,int a){if(a<0){System.out.println("初始化不合法!");return;}name = n;age = aSystem.out.println(name+":"+age);return ;//我们在函数那里学习了,没有返回值的函数中的return语句是可以省略的} }

工农区18382182576: 在计算机中,最适合进行数字加减运算的数字编码是__,最适合表示浮点数阶码的数字编码是 - .原码?反码?补码?移码? -
于剂必仙:[答案] 【参考答案】(1) C (2)D 【试题解析】 计算机中数字用原码表示直观,实现乘除运算规则较简单,但做加减运算时涉及符号的表示,很不方便.引入补码是要利用补数的特点,来方便地执行正负任意数的加减运算,实现变减运算为加运算,因此补码最...

工农区18382182576: 汇编语言中的减法 -
于剂必仙: 无符号数减法: SUB AX,BX 结果AX=AX-BX有符号数减法: SBB AX,BX 结果AX=AX-BX两者都影响进位标志.补充回答:后者是正数,减法的时候要把它转换成相反数的补码,然后两者作加法运算.

工农区18382182576: easyui两行数据减法运算怎么用代码实现 -
于剂必仙: function test(){<br>var id1 = $("#").val();//#后写控件ID<br> var id12 = $("#").val();<br> alert(id1-id2);<br>}<br>然后在控件按钮上加上这个事件

工农区18382182576: 怎么在C语言中实现减法 -
于剂必仙: 二个数相关即可吗?定义二个变量(变量类型应该与二个数的范围对应),直接相减就可以的.

工农区18382182576: 在个人计算机中,带符号整数中负数是采用()编码方法表示的.A原码 B反码 C补码 D移码.答案是C,其他几个选项是用来表示什么的?有什么区别? -
于剂必仙:[答案] 计算机中的有符号数是补码表示的,因为补码能够轻松将减法用加法来实现,从而简化了逻辑部分的设计. 关于原码、反码、补码、移码,这些在任何一本计算机入门课本的最初一章基础知识中都会有讲解,建议你阅读了解一下,并且最好动手计算...

工农区18382182576: 用汇编语言实现非压缩的BCD码数据减法 -
于剂必仙: 然后将其转换压缩BCD二进制乘法和除法,结果被转换回打包BCD就是了 数系统转换,使用压缩BCD硬计数,多字节无符号... 大量的计算,设计BCD格式,如最大的十年,二十年,所有的BCD算术很常见的,或您BCD长度不相同的方案并不...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网