變長整型採用1個標誌位和7個數據位的方式來對一個正整型數值進行壓縮,標誌位的做用是代表除7位數據位外餘下數據位的值是否爲零,具體計算方式爲:將數值與~0x7f進行與運算,若是數值爲0代表該數值的有效數據位爲7位,不然數值爲1代表仍然有有效數據將數值>>>7位後繼續前面的步驟,直至爲0。編碼
如127 二進制表示爲0b01111111,編碼爲 0b 0_1111111,spa
128二進制表示爲0b10000000,編碼爲 0b 00000001_10000000,.net
16384二進制表示爲 0b01000000_00000000,編碼爲0b 00000001_10000000_10000000blog
這裏能夠看到128採用變長整型編碼後佔2個字節,若是採用無符號整型編碼只佔1個字節,說明變長整型編碼在某些狀況下反而佔用更多的空間,如下是變長編碼佔用字節的詳細狀況:ci
佔用字節數 | 數值範圍 | 二進制形式 |
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」。get