1. 程式人生 > >談談變長整型

談談變長整型

變長整型採用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”。