iT邦幫忙

1

關於補數與二進位運算

  • 分享至 

  • xImage
  •  

補數為何存在?

為了將減法以加法的形式進行實作,減少電路開銷(省去減法器)。

補數的討論

一般來說,討論補數會考慮到兩種形式,在基底(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種組合


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言