关於补数与二进位运算

补数为何存在?

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

补数的讨论

一般来说,讨论补数会考虑到两种形式,在基底(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种组合


<<:  ISO 27001 资讯安全管理系统 【解析】(十五)

>>:  [无广告]自动封锁,诈骗电话,骚扰电话,行销,广告,推销,来电未显示,不明的电话,响一声就挂,一接就挂,一接秒挂

【Day15】代码分割 & 延迟载入 Code Splitting & Lazy loading

打包 Bundle bundle 的英文原意是指将东西捆成一綑, 而在程序用语中 所谓的 bundl...

SSRS Pass a Report Parameter Within a URL

欲找,RS可以指定汇出的档案名称否,结果看到这个. URL access parameter ref...

Day 23 Password Attacks - 密码攻击 (hydra, pw-inspector)

工具介绍 今天要体验的工具是hydra,有别於先前体验过的其他工具,虽然也是透过字典档的形式,但它支...

【Day21】I2C的介绍

I2C是什麽? I2C,又称 I²C(Inter-Interated Circuit),在 I2C ...

从 IT 技术面细说 Search Console 的 27 组数字 KPI (14) :检索统计

在 KPI 的层级中,提到在分成几种 Level 之前,有列出三组最重要的 Search Conso...