当前位置: 首页 > 资讯 >

关於补数与二进位运算

补数为何存在?

为了将减法以加法的形式进行实作,减少电路开销(省去减法器)。

补数的讨论

一般来说,讨论补数会考虑到两种形式,在基底(Base)为r的条件下,讨论以下

  1. r的补数 (r's complements),又称为radix complements
  2. (r - 1)的补数(r - 1's complements),又称为diminished radix complements

举例来说,以基底为10的数,我们会讨论其10的补数和9的补数

补数的定义

定义:有一数字N,基底为r,共有n位数,则

https://chart.googleapis.com/chart?cht=tx&chl=%24r%24的补数: https://chart.googleapis.com/chart?cht=tx&chl=%24r%5En%20-%20N%24
https://chart.googleapis.com/chart?cht=tx&chl=%24(r%20-%201)%24的补数: https://chart.googleapis.com/chart?cht=tx&chl=%24(r%5En%20-%201)%20-%20N%24

观察:https://chart.googleapis.com/chart?cht=tx&chl=%24(r%20-%201)%24的补数 = https://chart.googleapis.com/chart?cht=tx&chl=%24r%24的补数 https://chart.googleapis.com/chart?cht=tx&chl=%24-%201%24


范例1 : 有一数字135( N ),基底为10( r ),共有3( n )位数

https://chart.googleapis.com/chart?cht=tx&chl=%2410(%20r%20)%24的补数 : https://chart.googleapis.com/chart?cht=tx&chl=%24(10%5E3)%20-%20135%20%3D%201000%20-%20135%20%3D%20865%24
https://chart.googleapis.com/chart?cht=tx&chl=%249(r%20-%201)%24的补数 : https://chart.googleapis.com/chart?cht=tx&chl=%24(10%5E3%20-%201)%20-%20135%20%3D%20999%20-%20135%20%3D%20864%24
https://chart.googleapis.com/chart?cht=tx&chl=%249(r%20-%201)%24的补数 https://chart.googleapis.com/chart?cht=tx&chl=%24864%20%3D%2010(%20r%20)%24的补数 https://chart.googleapis.com/chart?cht=tx&chl=%24865%20-%201%24

范例2 : 有一数字https://chart.googleapis.com/chart?cht=tx&chl=%241101100(%20N%20)%24,基底为https://chart.googleapis.com/chart?cht=tx&chl=%242(%20r%20)%24,共有https://chart.googleapis.com/chart?cht=tx&chl=%247(%20n%20)%24位数
https://chart.googleapis.com/chart?cht=tx&chl=%242(%20r%20)%24的补数 : https://chart.googleapis.com/chart?cht=tx&chl=%24(2%20%5E%207)%20-%201101100%20%3D%2010000000%20-%201101100%20%3D%200010100%24

>  10000000
> - 1101100
> ---------
>   0010100

https://chart.googleapis.com/chart?cht=tx&chl=%241(r%20-%201)%24的补数: https://chart.googleapis.com/chart?cht=tx&chl=%24(2%20%5E%207%20-%201)%20-%201101100%20%3D%201111111%20-%201101100%20%3D%200010011%24

>   1111111
> - 1101100
> ---------
>   0010011

https://chart.googleapis.com/chart?cht=tx&chl=%241(r%20-%201)%24的补数 https://chart.googleapis.com/chart?cht=tx&chl=%240010011%20%3D%202(%20r%20)%24的补数 https://chart.googleapis.com/chart?cht=tx&chl=%240010100%20-%201%24%20

补数应用,使用补数实作出减法

范例1. 计算https://chart.googleapis.com/chart?cht=tx&chl=%2472532%20-%203250%20(M%20%3E%20N)%24
由於M为五位数,N为四位数,两位数相同才可进行运算,将N改为五位数,变成03250

  1. 将3250转换为补数的形式(使用10的补数)
原式           使用10的补数转换後
>   72532       >   72532
> - 03250  -->  > + 96750
>  ------       > -------
>   69282       >  169282 (1为进位,将其舍去)

减掉某一个数事实上就是加上他的补数


范例2. 计算https://chart.googleapis.com/chart?cht=tx&chl=%243250%20-%2072532%20(M%20%3C%20N)%24
由於M为四位数,N为五位数,两位数相同才可进行运算,将M改为五位数,变成03250

  1. 将72532转换为补数形式(使用10的补数)
原式           使用10的补数转换後   将计算得到的结果再做10的补数并加上负号
>   03250       >   03250         >  100000
> - 72532  -->  > + 27468    -->  > - 30718   --> 取负号 --> -69282
>  ------       > -------         > -------
>  -69282       >   30718         >   69282

范例3. 计算https://chart.googleapis.com/chart?cht=tx&chl=%241010100%20-%201000011%20(M%20%3E%20N)%24
1.将1000011转换为补数形式(使用2的补数)

原式           使用2的补数转换後
>   1010100       >   1010100
> - 1000011  -->  > + 0111101
>  --------       > ---------
>   0010001       >  10010001 (1为进位,将其舍去)

范例4. 计算https://chart.googleapis.com/chart?cht=tx&chl=%241000011%20-%201010100%20(M%20%3C%20N)%24
将1010100转换为补数形式(使用2的补数)

原式           使用2的补数转换後   将计算得到的结果再做2的补数并加上负号
>   1000011       >   1000011       >  10000000
> - 1010100  -->  > + 0101100  -->  > - 1101111   --> 取负号 --> -0010001
>  --------       > ---------       > ---------
>  -0010001       >   1101111       >   0010001

二进位有号数

为了表示一个有号数,我们将一个数字的最左边位元做为表示符号的用途,一般来说,0表示正数,1表示负数。

范例1. 使用8 bit 二进位有号数来表示-9
9的二进位无号数形式0001001
这里我们必须将最左边的bit用来表示正负号,因此我们只使用7个bit来表示这个数的数值大小,而表示数值大小我们有三种方式

1. 二进位     2. 1的补数       3. 2的补数
   0001001      1110110         1110111
   
1. 有号二进位  2. 有号1的补数   3. 有号2的补数
 [1]0001001   [1]1110110     [1]1110111

通常情况我们使用2的补数来做为表示,原因为使用二进位表示法和1的补数表示法,会存在0有两种不同的表示法,且两者皆无法表示-8,而2的补数不存在这一些问题,因此我们使用2的补数做为表示有号数的方式。

表示范围

对一个有n bit的二进位系统而言
无号数范围 https://chart.googleapis.com/chart?cht=tx&chl=%240%24 ~ https://chart.googleapis.com/chart?cht=tx&chl=%242%5En%20-%201%24
有号数范围 https://chart.googleapis.com/chart?cht=tx&chl=%242%5E%7Bn-1%7D%24 ~ https://chart.googleapis.com/chart?cht=tx&chl=%242%5E%7Bn-1%7D-%201%24%20

以4 bit的二进位系统而言
无号数范围 https://chart.googleapis.com/chart?cht=tx&chl=%240%24 ~ https://chart.googleapis.com/chart?cht=tx&chl=%2415%24
有号数范围 https://chart.googleapis.com/chart?cht=tx&chl=%24-8%24 ~ https://chart.googleapis.com/chart?cht=tx&chl=%247%24

比较2的补数和有号2的补数

我们使用有号8 bits的二进位表示法来表示-9

有号2的补数
 9 =  0001001 (只使用7个bit)
-9 = 11110111 (加上符号表示的bit)

2的补数
 9 = 00001001 (使用8个bit)
-9 = 11110111 

小结:n bits的二补数表示法 = (n - 1)bits有号二的补数表示法

加法与减法

  1. 负数以2的补数法来表示
  2. 使用加法进行运算
  3. 产生进位时,省略
  4. 产生结果为负时,会自动转换为2的补数

范例1. https://chart.googleapis.com/chart?cht=tx&chl=6%20%2B%20(-13)

十进位   7 bits二进位  有号2的补数
  6      0000110      0_0000110
 13      0001101      0_0001101 
-13                   1_1110011(取13对2的补数後加上符号)

------------------------------------------------------

>     6   有号2的补数  >   00000110
> +(-13)  -------->   > + 11110011
> ------              > ----------
>    -7               >   11111001
>                         ^
>                       负数符号 後方7bit为7的2的补数

溢位(Overflow)

假设一个8 bit系统的有号二补数的加法

>   65    >   01000001
> + 70    > + 01000110
> ----    > ----------
>  135    >   10000111

加完之後我们会发现值变成负的,这是因为8 bit二埔数系统表示的值范围在-128 ~ 127,而65 + 70 = 135,这个值超出了表示范围,因此出现错误的结果,这样的现象称为溢位。

BCD(Binary Coded Decimal)

使用一组4 bit来表示十进位0 ~ 9。

范例 1: https://chart.googleapis.com/chart?cht=tx&chl=%2423%3D(0010%2C0011)_%7Bbcd%7D%3D(0001%2C0111)_2%24

好处:快速将十进位转换到二进位,有些无法以二进位有限位数表示的小数,如0.2,使用BCD可以非常简便的表示出来
坏处:浪费记忆体中间,本来4 bit可以表示成16种组合,现在只能表示成10种组合


相关文章:

  • 软件工程:SDLC V-Model
  • React.js 职场实战!图片 Infinite List
  • DAY 29 Django 简易入门教学(六)-建立资料库与模型(Model)
  • day 5 knock, knock我要开始coroutine
  • Day 9 - 依 DEALERS 前台页面分析拆解後,逐步建立後台功能 (下) - 图档同名处理 - ASP.NET Web Forms C#
  • 冒险村23 - Design Pattern(3) - Builder
  • IT铁人DAY 1-进入物件导向世界前的心理准备
  • [Day 21 - React] 今晚我想来点,React的其他功能
  • Day 18【Opensea.js】我的这把刀可是涂满了毒药的毒刃
  • Terraform
  • Day 21 : 模型优化 - 剪枝 Pruning
  • 以 GraphQL 查询 Neo4j 资料库
  • Day 4: LeetCode 995. Minimum Number of K Consecutive Bit Flips(v2)
  • 范例(二)预测心血管疾病的可能性
  • [Day22] 传值跟传参考概念
  • Facebook和instagram推广营销教程
  • SiteGround域名转移教程:如何转出SiteGround域名
  • 微信小程序搭建教程:怎么用CentOS搭建小程序服务器
  • Jungle Scout选品工具中文版好用吗?亚马逊选品为什么要用JungleScout
  • PayPal国外买东西教程:银联卡(国内储蓄卡信用卡)怎么用PayPal买国外的东西更安全
  • 洛杉矶CN2服务器推荐:PCCW线路VPS,服务器服务商layerhost
  • 搬瓦工VPS注册购买教程 – 支付宝BandwagonHost购买方法教程
  • PayPal绑定国内手机卡的方法:国外PayPal怎么绑定国内手机号
  • 升级wordpress出错怎么办?wordpress升级502错误解决方法
  • 海外营销周报:谷歌产品评论算法更新,YouTube和Facebook仍是美社交媒体主流
  • WordPress 5.7.1 修复2个安全问题,请及时更新
  • 免费用谷歌云的方法:最新谷歌云300美金免费用的申请教程和方法
  • Python入门教程:Python怎么写
  • 专业提供东南亚-越南线上支付通道
  • 2020最新Google Voice号码申请方法(非脚本)