談談變長整型

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

相關文章
相關標籤/搜索