非負整數
(0
、正整數
)
分組
決定每組有幾個
數字
例如:每組有10個數字
用除法
對數字進行分組
例如:數字42,第4組第2個
42 / 10 = 4
42 % 10 = 2
第幾組 | 編碼 |
---|---|
第0組 | 0 |
第1組 | 10 |
第2組 | 110 |
第3組 | 1110 |
第4組 | 11110 |
每組10個,可能的餘數為0 ~ 9
使用二進位編碼
第幾個 | 編碼 |
---|---|
第0個 | 0000 |
第1個 | 0001 |
第2個 | 0010 |
第3個 | 0011 |
第4個 | 0100 |
第5個 | 0101 |
第6個 | 0110 |
第7個 | 0111 |
第8個 | 1000 |
第9個 | 1001 |
1010 | |
1011 | |
1100 | |
1101 | |
1110 | |
1111 |
用4bit去編碼,有的編碼沒有使用到
因為4bit編碼沒有全部用完
有的數字以3bit編碼
有的數字以4bit編碼
沒用到的編碼的數量 2^4 - 10 = 6
前6個數字(0 到 5) 以3bit編碼
其他數字,仍然以4bit編碼
第幾個 | 編碼 |
---|---|
第0個 | 000 |
第1個 | 001 |
第2個 | 010 |
第3個 | 011 |
第4個 | 100 |
第5個 | 101 |
第6個 | 011 0 |
第7個 | 011 1 |
第8個 | 100 0 |
第9個 | 100 1 |
解碼的時候,先讀取3bit
如果3bit的數值
小於沒有使用的空間 6
第幾個 = 3bit的數值
否則
需要再讀取1bit
現在的問題是:4bit數字
的前3bit
小於6
在解碼的時候,它就不會再讀取1bit
解法:使用別的4bit數字
新的
4bit數字 = 舊的
4bit數字 + 6
第幾個 | 編碼 |
---|---|
第0個 | 000 |
第1個 | 001 |
第2個 | 010 |
第3個 | 011 |
第4個 | 100 |
第5個 | 101 |
0110 | |
0111 | |
1000 | |
1001 | |
1010 | |
1011 | |
第6個 | 1100 |
第7個 | 1101 |
第8個 | 1110 |
第9個 | 1111 |
數字42,它位於第4組第2個
它的格倫布編碼
11110
010
先看看有幾個1
遇到0之前,總共有幾個1
每組個數 = 10
10不是2的次方(例如:2^1、2^2、2^3)
位於 2^3 到 2^4 之間
使用3bit
或4bit
編碼
沒有使用的空間 = 2^4 - 10 = 6
先讀取3bit的數值
如果3bit的數值
小於沒有使用的空間 6
第幾個 = 3bit的數值
否則
再讀取1bit
第幾個 = 4bit的數值
- 沒有使用的空間 6
11110
010
原數字 = 第4組 * 每組個數 10
+ 第2個 = 42
數字 → 第幾個數字
以數字9為例
它是第10個數字(最前面的數字是0)
10的二進位是 1010
補0
最高位bit 一定是1
其他位bit的長度 3
在1010前面補3個0
補3個0的意思
在解碼的時候
遇到1之後,要繼續讀取3bit
表示數字9位於第3組
數字9的指數哥倫布編碼為
000
1010
數字 | 編碼 |
---|---|
0 | 1 |
1 | 010 |
2 | 011 |
3 | 00100 |
4 | 00101 |
5 | 00110 |
6 | 00111 |
7 | 0001000 |
8 | 0001001 |
9 | 0001010 |
10 | 0001011 |
11 | 0001100 |
12 | 0001101 |
13 | 0001110 |
14 | 0001111 |
15 | 000010000 |
第幾組 | 個數 |
---|---|
第0組 | 1個 |
第1組 | 2個 |
第2組 | 4個 |
第3組 | 8個 |
第4組 | 16個 |
每組第0個
的指數哥倫步編碼第幾組 | 編碼 |
---|---|
第0組 | 1 |
第1組 | 010 |
第2組 | 00100 |
第3組 | 0001000 |
第4組 | 000010000 |
第2組第0個 = 第4個數字
100 = (第1組個數 + 第0組個數) + 1
= (2^1 + 2^0) + 1
= 4
第3組第0個 = 第8個數字
1000 = (第2組個數 + 第1組個數 + 第0組個數) + 1
= (2^2 + 2^1 + 2^0) + 1
= 8
數字9的指數哥倫布編碼為
000
1010
遇到1之前,總共有幾個0
3個0表示
遇到1之後,要繼續讀取3bit
1010(二進位) = 10(十進位)
第10個數字 = 數字9
10 - 1 = 9
0階
指數哥倫布編碼前面介紹的,就是0階
指數哥倫布編碼
數字9的0階
指數哥倫布編碼為
000
1010
1階
指數哥倫布編碼以數字9為例
先轉成二進位
1001
因為是1階
,把最低1bit
暫時刪除
100
把100去做0階
指數哥倫布編碼
100 → 數字4 → 第5個數字 → 101
補0之後,得到 00101
把刪除的1bit補回來
數字9的1階
指數哥倫布編碼00101
1
解碼
遇到1之前,總共有幾個0
讀取了001
總共有2個0
本來要繼續讀取2bit
但是,因為它是1階
指數哥倫布編碼
所以,遇到1之後,繼續讀取 (2 + 1) bit
讀取的結果為00101
1
解碼方法100101
1
↓ 暫時刪除1bit00101
↓ 減100100
↓ 補回1bit00100
1
↓
9
解碼方法200101
1 (二進位) = 11 (十進位)
因為是1階
指數哥倫布編碼
11 - 2^1 = 9
0階
vs1階
指數哥倫布編碼數字 | 0階 | 1階 |
---|---|---|
0 | 1 |
1 0 |
1 | 010 |
1 1 |
2 | 011 |
010 0 |
3 | 00100 |
010 1 |
4 | 00101 |
011 0 |
5 | 00110 |
011 1 |
6 | 00111 |
00100 0 |
7 | 0001000 |
00100 1 |
8 | 0001001 |
00101 0 |
9 | 0001010 |
00101 1 |
10 | 0001011 |
00110 0 |
11 | 0001100 |
00110 1 |
12 | 0001101 |
00111 0 |
13 | 0001110 |
00111 1 |
14 | 0001111 |
0001000 0 |
15 | 000010000 |
0001000 1 |