談談變長整型
阿新 • • 發佈:2018-11-26
變長整型採用1個標誌位和7個數據位的方式來對一個正整型數值進行壓縮,標誌位的作用是表明除7位資料位外餘下資料位的值是否為零,具體計算方式為:將數值與~0x7f進行與運算,如果數值為0表明該數值的有效資料位為7位,否則數值為1表明仍然有有效資料將數值>>>7位後繼續前面的步驟,直至為0。
如127 二進位制表示為0b01111111,編碼為 0b 0_1111111,
128二進位制表示為0b10000000,編碼為 0b 00000001_10000000,
16384二進位制表示為 0b01000000_00000000,編碼為0b 00000001_10000000_10000000
這裡可以看到128採用變長整型編碼後佔2個位元組,如果採用無符號整型編碼只佔1個位元組,說明變長整型編碼在某些情況下反而佔用更多的空間,以下是變長編碼佔用位元組的詳細情況:
佔用位元組數 | 數值範圍 | 二進位制形式 |
1 | <128 | 0b10000000 |
2 | <16384 | 0b01000000_00000000 |
3 | <2097152 | 0b00100000_00000000_00000000 |
4 | <268435456 | 0b00010000_00000000_00000000_00000000 |
5 | <34359738368 | 0b00001000_00000000_00000000_00000000_00000000 |
6 | <4398046511104 |
0b00000100_00000000_00000000_00000000_00000000_00000000 |
7 | <562949953421312 | 0b00000010_00000000_00000000_00000000_00000000_00000000_00000000 |
8 | <72057594037927936 | 0b00000001_00000000_00000000_00000000_00000000_00000000_00000000_00000000 |
9 | <=9223372036854775807 | 0b01111111_11111111_11111111_11111111_11111111_11111111_11111111_11111111l |
10 | 所有負數 |
由於負數的符號位是1,那麼採用該編碼後是不能達到壓縮資料的效果的,改進的方法之一是採用zigzag編碼,可以參考“整形數值壓縮---Vint與zigzag”。