章節導學
1. 進位制運算的基本知識
1.1 進位制概述
進位制的定義
- 有限種數字符號來表示無限的數值
- 進位制是一種記數方式,亦稱進位計數法或位值計數法
- 使用的數字符號的數目稱為這種進位制的基數或底數
常見的進位制
- 二進位制
- 八進位制
- 十六進位制
- 二十進位制
- 六十進位制
1.2 二進位制運算的基礎
二進位制(整數)轉換十進位制
二進位制(整數)轉換十進位制:按權展開法
正整數N,基數為r
? = ??−1??−2 ⋯ ?1?0
= ??−1r?−1 +??−2 r?−2 + ⋯ + ?1? + ?0
例:? = 01100101 = 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 22 + 1 = 101
例:? = 11101101 = 1 ∗ 27 + 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 23 + 1 ∗ 22 + 1 = 237
十進位制(整數)轉換二進位制
十進位制(整數)轉換二進位制:重複相除法
例:(101)10 = ( )2
重複除以2 | 得商 | 取餘數 | |
---|---|---|---|
101/2 | 50 | 1 | |
50/2 | 25 | 0 | 按 |
25/2 | 12 | 1 | 逆 |
12/2 | 6 | 0 | 序 |
6/2 | 3 | 0 | 排 |
3/2 | 1 | 1 | 列 |
1/2 | 0 | 1 | |
二進位制結果 | 01100101 |
? = (01100101)2 = 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 22+ 1 = (101)10
例:23710 = ( )2
重複除以2 | 得商 | 取餘數 | |
---|---|---|---|
237/2 | 118 | 1 | |
118/2 | 59 | 0 | 按 |
59/2 | 29 | 1 | 逆 |
29/2 | 14 | 1 | 序 |
14/2 | 7 | 0 | 排 |
7/2 | 3 | 1 | 列 |
3/2 | 1 | 1 | |
1/2 | 0 | 1 | |
二進位制結果 | 11101101 |
? = (11101101)2 = 1 ∗ 27 + 1 ∗ 26 + 1 ∗ 25 + 1 ∗ 23 + 1 ∗ 2^2 + 1 = (237)10
二進位制(小數)轉換十進位制
二進位制(小數)轉換十進位制:按權展開法
小數N,基數為r,從小數點右邊開始,小數點左邊為正,右邊為負
? = ??−1??−2 ⋯ ?1?0
= ??−1r?−1 +??−2 r?−2 + ⋯ + ?1? + ?0
例:? = (0.11001) = 1 ∗ 2−1 + 1 ∗ 2−2 + 1 ∗ 2−5 = 0.78125 = 25/32
例:? = (0.01011) = 1 ∗ 2−2 + 1 ∗ 2−4 + 1 ∗ 2−5 = 0.34375 = 11/32
十進位制(小數)轉換二進位制
十進位制(小數)轉換二進位制:重複相乘法
- 重複乘以2
- 得積
- 取整數部分
- 結果按正序排列
十進位制(分數)轉換二進位制
十進位制(分數)轉換二進位制:重複相乘法
- 重複乘以2
- 得積:
把假分數化為真分數
- 取1:
取第一個數值
- 結果按正序排列
例:25/32轉化為二進位制
重複乘以2 | 得積 | 取1 | |
---|---|---|---|
25/32 | 50/32= 1+9/16 | 1 | 按 |
9/16 | 18/16= 1+1/8 | 1 | 正 |
1/8 | 1/4= 0+1/4 | 0 | 序 |
1/4 | 1/2= 0+1/2 | 0 | 排 |
1/2 | 1= 1+0 | 1 | 列 |
二進位制結果 | 0.11001 |
? = 0.11001 = 1 ∗ 2−1 + 1 ∗ 2−2 + 1 ∗ 2−5 = 0.78125=25/32
例:11/32轉化為二進位制
重複乘以2 | 得積 | 取1 | |
---|---|---|---|
11/32 | 11/16= 0+11/16 | 0 | 按 |
11/16 | 11/8= 1+3/8 | 1 | 正 |
3/8 | 3/4= 0+3/4 | 0 | 序 |
3/4 | 3/2= 1+1/2 | 1 | 排 |
1/2 | 1/1= 1+0 | 1 | 列 |
二進位制結果 | 0.01011 |
? = 0.01011 = 1 ∗ 2−2 + 1 ∗ 2−4 + 1 ∗ 2−5 = 0.34375 = 11/32
2. 二進位制資料的表示方法
2.1 有符號數與無符號數
+表示正數,-表示負數
2.2 二進位制的原碼錶示法
原碼錶示法特點
- 規定符號位位於數值第一位
- 使用0表示正數、1表示負數
- 表達簡單明瞭,是人類最容易理解的表示法
0在原碼中有兩種表示方法:00、10
原碼進行運算非常複雜,特別是兩個運算元符號不同的時候
2.3 二進位制的補碼錶示法
補碼的定義
例子1:n=4,x=13,計算x的二進位制原碼和補碼
原碼:x=0,1101
補碼:x=0,1101
例子2:x=-13,計算x的二進位制原碼和補碼
原碼:x=1,1101
補碼:2?+1 + ? = 24+1 − 13 = 100000 − 1101 = 1 0011(高亮部分為符號位) 補碼:x=1,0011
例子3:x=-7,計算x的二進位制原碼和補碼
原碼:x=1,0111
補碼:2?+1 + ? = 24+1 − 7 = 100000 − 0111 = 1 1001 補碼:x=1,1001
例子4:x=-1,計算x的二進位制原碼和補碼
原碼:x=1,0001
補碼:2?+1~ + ? = 24+1 − 1 = 100000 − 0001 = 1 1111 補碼:x=1,1111
引進補碼的目的
使用加法代替減法操作,從而消除減法
減法運算複雜,希望找到使用正數替代負數的方法
但在計算補碼的過程中,還是使用了減法!!
2.4 二進位制的反碼錶示法
反碼的定義
例子1:x=-13,計算x的二進位制原碼和反碼
原碼:x=1,1101
反碼:(2?+1−1) + ? = (24+1−1)− 13 = 011111 − 1101 = 1 0010(高亮部分為符號位) 反碼:x=1,0010
例子2:x=-7,計算x的二進位制原碼和反碼
原碼:x=1,0111
反碼:(2?+1−1) + ? = (24+1−1) − 7= 011111 − 0111 = 1 1000 反碼:x=1,1000
從以上兩個例子中可以看出按照定義求反碼依然有減法
引進反碼的目的
消除減法
通過以下規則求反碼可以消除減法的出現
負數的反碼等於原碼除符號位外按位取反
負數的補碼等於反碼+1
例子3:x=-7,計算x的二進位制原碼和反碼和補碼
原碼:x=1,0111
反碼:x=1,1000
補碼:x=1,1001
例子4:x=-9,計算x的二進位制原碼和反碼和補碼
原碼:x=1,1001
反碼:x=1,0110
補碼:x=1,0111
2.5 小數的二進位制補碼錶示
二進位制小數的補碼定義
負數的反碼等於原碼除符號位外按位取反
負數的補碼等於反碼+1
例子1:x= 9/16,計算x的二進位制原碼和反碼和補碼
原碼:x=0,0.1001 (重複相乘法)
反碼:x= 0,0.1001
補碼:x= 0,0.1001
例子2:x= -11/32,計算x的二進位制原碼和反碼和補碼
原碼:x=1,0.01011 (重複相乘法)
反碼:x=1,1.10100
補碼:x=1,1.10101
3. 二進位制資料的運算
3.1 定點數與浮點數
3.1.1 定點數的表示方法
定點數:小數點固定在某個位置的數稱之為定點數
3.1.2 浮點數的表示方法
浮點數的表示格式
舉例引入:
123450000000 = 1.2345 × 1011(科學計數法)
1.2345:尾數
10:基數 11:階碼
浮點數的表示格式
S:尾數 , r:基數 , j:階碼
舉例
11.0101 = 0.110101 × 210 11.0101 = 0.0110101 × 211
浮點數的表示範圍
階碼錶示範圍: [−(?? − ?), ?? − ?]
尾數表示範圍: [−(? − ?−?), −(?−?)] [?−?, ? − ?−?]
浮點數的規格化
- 尾數規定使用純小數
- 尾數最高位必須是1
舉例
123450000000 = 1.2345 × 1011
錯誤寫法:
舉例
11.0101 = 0.110101 × 210
錯誤寫法:
例子1:設浮點數字長為16位,階碼為5位,尾數為11位,將十進位制數 13/128表示為二進位制浮點數。
- 利用重複相乘法求出原碼
- 原碼=反碼=補碼:? = 0.0001101000
例子2:設浮點數字長為16位,階碼為5位,尾數為11位,將十進位制數−54表示為二進位制浮點數。
- 原碼: ? = 1,110110
3.1.3 定點數與浮點數的對比
- 當定點數與浮點數位數相同時,浮點數表示的範圍更大
- 當浮點數尾數為規格化數時,浮點數的精度更高
- 浮點數運算包含階碼和尾數,浮點數的運算更為複雜
- 浮點數在數的表示範圍、精度、溢位處理、程式設計等方面均優於定點數
- 浮點數在數的運算規則、運算速度、硬體成本方面不如定點數
3.2 定點數的加減法運算
3.2.1 加法運算
整數加法:A[補] + B[補] = (? + ?)[補] (???2?+1)
小數加法:A[補] + B[補] = (? + ?)[補] (???2)
數值位與符號位一同運算,並將符號位產生的進位自然丟掉
例子1:A=-110010, B=001101,求A+B
A[補] = 1,001110
B[補]= B[原] = 0,001101
A[補] + B [補]= (A + B) [補] =1,011011
A + B = −100101
數值位與符號位一同運算,並將符號位產生的進位自然丟掉
例子2:A=-0.1010010, B=0.0110100,求A+B
A[補] = 1,1.0101110
B[補] = B[原] = 0,0.0110100
A[補] + B[補]= (A + B)[補] =1,1.1100010
A + B =-0.0011110
數值位與符號位一同運算,並將符號位產生的進位自然丟掉
例子3:A=-10010000, B=-01010000,求A+B
A[補] = 1, 01110000
B[補] = 1, 10110000
A[補] + B[補] = (A + B)[補] =1,00100000
A + B =-11100000
驗證:A = −144, B = −80 , A + B = −224
數值位與符號位一同運算,並將符號位產生的進位自然丟掉
例子4:A=-10010000, B=-11010000,求A+B
A[補] = 1, 01110000
B[補] = 1, 00110000
A[補] + B[補] = (A + B) 補 = 0,10100000
A + B = 10100000
驗證:
A = −144, B = −208, A + B = 160
數值位與符號位一同運算,並將符號位產生的進位自然丟掉
3.3.2 判斷溢位
雙符號位判斷法
- 單符號位表示變成雙符號位:0=>00, 1=>11
- 雙符號位產生的進位丟棄
- 結果的雙符號位不同則表示溢位
再來看例子4:A=-10010000, B=-11010000,求A+B
A[補] = 1, 01110000
B[補] = 1, 00110000
再來看例子3:A=-10010000, B=-01010000,求A+B
A[補] = 1, 01110000
B[補] = 1, 10110000
(A + B)[原] = 11,11100000 = −11100000
3.2.3 減法運算
整數減法:A[補] − B[補] = ? + (−?)[補] (???2?+1)
小數減法:A[補] − B[補] = ? + (−?)[補] (???2)
-B[補]等於B[補]連同符號位按位取反,末位加一
B[補] = 1,0010101
(−B)[補] = 0,1101011
例子5:A=11001000, B=-00110100,求A-B
A[補] = A[原] = 0,11001000
B[補] = 1,11001100
(−B)[補] = 0,00110100
A[補] − B[補] = A[補] + (−B)[補] = A + (−B)[補]
A + (−B)[補] = 0,11111100
A − B = 111111100 (正數的補碼還是自身)
3.3 浮點數的加減法運算
? = ?? × ??? ? = ?? × ??y
操作流程
3.3.1 對階
- 浮點數尾數運算簡單
- 浮點數位數實際小數位與階碼有關
- 階碼按小階看齊大階的原則
- 対階的目的是使得兩個浮點數階碼一致,使得尾數可以進行運算
舉例
? = 0.1101 × 201 , ? = (−0.1010) × 211, 求 x+y
3.3.2 尾數求和
- 使用補碼進行運算
- 對於減法運算要轉化為加法運算:A - B = A + (-B)
3.3.3 尾數規格化(左移)
對補碼進行規格化需要判斷兩種情況:S>0 和 S<0
S[補] = 00.1xxxxxx(? > 0)
S[補] = 11.0xxxxxx(? < 0)
符號位與最高位不一致
如果不滿足此格式,即符號位與最高位一致, 需要進行左移,同時階碼相應變化,以滿足規格化
因此:? + ? = −0.1110 × 210
3.3.4 尾數規格化(右移)
- 一般情況下都是左移
- 雙符號位不一致下需要右移 (定點運算的溢位情況)
- 右移的話則需要進行舍入操作
3.3.5 舍入
- “0舍1入”法(二進位制的四捨五入)
例1:
S [補] = 10.10110111
S [補] = 11.01011011(1) 【1次尾數右移,記得階碼要+1哦】
例2:
S [補] = 01.11111111
S [補] = 00.10000000(1)
S [補] = 01.00000000
S [補] = 00.1000000(0)【兩次右規,記得階碼要+2哦】
3.3.6 溢位判斷
- 定點運算雙符號位不一致為溢位
- 浮點運算尾數雙符號位不一致不算溢位【因為尾數雙符號位可以進行右規】
- 浮點運算主要通過階碼的雙符號位判斷是否溢位
- 如果規格化後,階碼雙符號位不一致,則認為是溢位
例子:? = 0.11010011 × 21101,? = 0.11101110 × 21100,假設階碼4位,尾數8位,計算x + y
? + ?[原] = ? + ?[補] = 0.10100101 × 21110
3.3.7 浮點數的加減法運算總結
尾數右移1位:階碼加1
尾數左移1位:階碼減1
3.4 浮點數的乘除法運算
這部分作為了解
? = ?? × ??? ? = ?? × ??y
乘法:階碼相加,尾數求積
? × ? = ( ?? × ?? ) × ?(??+?y)
除法:階碼相減,尾數求商
?/? = ( ?? / ?? ) × ?(??−?y)
操作流程
例子:? = 0.11010011 × 21101,? = 0.11101110 × 20001,假設階碼4位,尾數8位,計算x * y
? × ? = ( ?? × ?? ) × ?(??+?y)
= (0.11010011 × 0.11101110) × ?1101+0001
= 0.11000100(保留八位) × ?1110