[一 數制和編碼](#一 數制和編碼)
[二 定點數](#二 定點數)
一 數制和編碼
- 奇偶校驗
- 海明碼
- 循環冗余校驗碼
1.數制相互轉換
1.1 r進制到十進制
1.2 二進制到八進制、十六進制
1.3 十進制到r進制
2.BCD碼
3.字符與字符串
3.1 字母存儲
3.2 漢字存儲
4.校驗碼
4.1 奇偶校驗
4.2 海明碼
4.2.1 求解步驟
(1)確定校驗碼位數
- \(2^k\ge n+k+1(n+k種出錯,1種正確)\)
- n個信息位;k個校驗位,校驗碼有\(2^k\)種狀態;
(2)確定校驗碼位置
-
\(P_i\)放在\(2^{i-1}\)的位置上,其余按順序
-
信息位\(D_4D_3D_2D_1(1010)\),校驗位\(P_3P_2P_1\),海明碼為\(H_7H_6H_5H_4H_3H_2H_1\)
(3)求校驗位的值
-
由\(H_i\)位置\(i\)算出對應的二進制碼
-
從右到左按列\(h\)觀察,選出所有為1的\(H_i\)。找出\(H_i\)對應的信息位\(D_j\),對所有\(D_j\)進行異或運算,則可得出對應的\(P_h\)
(4)糾錯
-
對校驗方程進行計算
-
若出現偶校驗錯誤,將結果\(S_3S_2S_1\)轉為十進制,對應位置即為錯誤位置
4.2.2 檢錯與糾錯
-
檢錯能力:2;糾錯能力:1
-
全體校驗
當兩個跳變時,無法根據對應的位置確定它就是出錯位。即上面無法區別是1位錯還是2位錯。所以引入全校驗位,在最后面加上\(P_全\),該值是由原始數據得出偶校驗碼。
現在對傳輸的數據進行一次全體偶校驗進行分析
4.3 循環冗余校驗碼
CRC。數據發送、接受方約定一個“除數”,保證余數為0
4.3.1 求CRC碼
(1)確定長度與二進制碼
- 信息碼長度K;
- 校驗碼R=生成多項式最高次冪或(二進制碼位數-1);
- 校驗碼位數N=K+R
- 二進制碼:生成多項式的系數
(2)由模2除法求CRC碼
- 信息碼低位補R個0(右側)
- 模2除法
-
被除數:信息位+R個0
-
除數:二進制碼
-
除的時候看被除數的最高位作為商,減的時候用異或運算。
-
余數比被除數少一位,余數結果為校驗位
-
- CRC碼:信息位+校驗位
4.3.2 檢錯與糾錯
-
示例
-
檢錯:
可檢測出所有奇數個錯誤;
可檢測出所有雙比特的錯誤;
可檢測出所有小於等於校驗位長度的連續錯誤;
-
糾錯:
K個信息位,R個校驗位,若生成多項式選擇得當,且 \(2^R\ge K+R+1\),CRC碼可糾正1位錯。
二 定點數
- 補碼作用
- [移位運算](#2.2 移位運算)
- [加減運算](#2.3 加減運算)
- [乘法運算](#2.3 乘法運算)
- [除法運算](#2.4 除法運算)
1.定點數的表示
表示范圍
類型 | 范圍 |
---|---|
無符號數(n) | \(0\sim2^n-1\) |
原碼/反碼整數(n+1) | \(-(2^n-1)\le x\le 2^n-1\) |
原碼/反碼小數(n+1) | \(-(1-2^{-n})\le x\le 1-2^{-n}\) |
補碼/移碼整數(n+1) | \(-2^n\le x\le2^n-1\\比原碼多表示一個-2^n\) |
補碼小數(n+1) | \(-1\le x\le1-2^-n\\比原碼多一個-1\) |
2.定點數運算
2.1 補碼作用
減法換加法,減少硬件成本(ALU無需集成減法器)
\(x=qm+r\\x~mod~12=r\\q為整數,r為余數,m為模。即要在r相等的情況下找到x\)
- 模余數相同的數是同一類,等價。即可知-3和9在模12的條件下是等價的。
- 互為補數:兩個數的絕對值=模。減去一個數即加上這個數的補數。也就是\(10+(-3)\)可轉換成\(10+9\)再取模。
- 而計算機是以\(2^8(1,00000000)\)為模的,a的補數=模-|a|=全部取反再+1
2.2 移位運算
2.2.1 算數移位
補碼的算數移位
-
正數和原碼一致
-
由於負數補碼=反碼末位+1。所以反碼最右邊連續的1會因進位變成0,直到第一個0。故負數補碼最右邊的1及其右邊與原碼一致。而其左邊與反碼一致。所以造成了:
- 右移(同反碼):高位補1,低位舍棄。
- 左移(同原碼):低位補0,高位舍棄。
加法舉例
2.2.2 邏輯移位
RGB值例子:例如用3B儲存102、139、133
102的二進制數儲存進去並向左移動16位
139的二進制數儲存進去並向左移動8位
133的二進制數儲存進去
相加得3B的RGB值
2.2.3 循環移位
2.3 加減運算
2.3.1 溢出判斷
-
方法一:一位符號位
\[V=AB\overline{S}+\overline{AB}S\\加數的符號位為:A、B;結果的符號位S:\\乘法表示與,加法表示或 \] -
方法二:一位符號位,根據進位情況判斷
\[V=C_1\oplus C_s\\ 結果的最高數值位的進位:C_1;\\符號位的進位:C_s; \] -
方法三:雙符號位
\[V=S_{s1}\oplus S_{s2}\\正數符號位:00;負數符號位11;\\結果的兩個符號位分別是S_{s1}S_{s2} \]==>V=0無溢出;V=1溢出
2.3 乘法運算
圖示
- 原碼一位乘法
- 補碼一位乘法中MQ新增了紅色部分(輔助位),為保持一致ACC、X也加了一位,變成雙符號位。
運算過程
-
原碼一位乘法
-
補碼一位乘法
2.4 除法運算
2.4.1 思想
確定商:若被除數大於除數,確定1,否則0;補零繼續算
2.4.2 恢復余數法(原碼)
ACC | 被除數、余數 |
---|---|
MQ | 商 |
X | 除數 |
-
由於計算機不會比較被除數與除數的大小,所以會默認上商1。它根據(被除數-除數/余數-除數/ACC-X)的結果的符號位判斷商1或是商0,若結果是負數,則說明被除數小於除數,即商1是錯的,此時需要變成商0,且回復余數。
-
\(被除數-除數=(ACC)-[|y|]=(ACC)+[-|y|]_補\)。更具體的轉換過程:
-
先將原碼\(y\)變成\([y]_補\)
若y為正,\([y]_補\)與原碼一致
若y為負,\([y]_補\)為原碼的符號位不變,后面取反
-
再將\([y]_補\)變為\([-y]_補\)
\([y]_補\)全部取反再,末位+1
-
-
若上面結果是負數-->恢復余數:\((ACC)+除數=(ACC)+[|y|]_補\),商變回0,再計算
-
每次計算完邏輯左移,低位補0。機器字長有幾位就求幾位的商
-
余數=結果*\(2^n\)(n=機器字長-符號位,左移n次 上商n+1次)
-
示例:
設機器字長為5位(含1位符號位,n=4),x=0.1011,y=0.1101,采用原碼恢復余數法求x/y。\(|x|=0.1011,|y|=0.1101,[|y|]_補=0.1101,[|-y|]_補=1.0011\)
2.4.2 加減交替法(原碼)
也稱不恢復余數。原理:若余數為負,直接商0。余數不恢復,而是:
\(新余數=余數左移1位+|除數|~(左移1位即乘以2)\)
過程
2.4.3 加減交替法(補碼)
3.強制類型轉換
C語言中以補碼的形式存儲
有符號數與無符號數:不改變數據內容,只改變解釋方式(符號位被當做數值位)
void main(){
//有符號數:short,占2字節;
//無符號數:unsigned
short x=-4321;//[x]原=1001000011100001;[x]補=1110111100011111
unsigned short y=(unsigned short)x//y=1110111100011111,真值61215
}
長整數變短整數:高位截短,保留低位
void main(){
//int:占4字節
int a=-165537,b=-34991;//a:0x000286a1 b:0xffff7751
short c=(short)a,d=(short)b//c:0x68a1(-31071) d:0X7751(30545)
}
短整數變長整數:符號擴展
void main(){
//負數補1,正數補0
short x=-4321;
int m=x;//前面補1
unsigned short n=(unsigned short)x;//變成了無符號數
unsigned int p=n;//前面補0
}