vint相信你們比較熟悉了,是可變長的整形,籠統的說就是較小的正整形數值將佔用較小的空間。如int value=10,將佔用4個字節的空間,很明顯1個字節就足以存儲10了。編碼的規則以下:標誌位(1bit)+數據位(7bit),也就是將數值按7位進行截取,若是後續位的值不爲0標誌位爲1不然爲0,一直重複這樣的步驟。java
如10寫成二進制形式00000000_00000000_00000000_00001010,採用vint表示00001010;算法
如266寫成二進制形式00000000_00000000_00000001_00001010,採用vint表示 00000010_10001010;編碼
但問題是負數採用vint編碼必定會增長佔用空間,由於最高位符號位爲1。.net
如何對絕對值較小的負數如-一、-2等進行壓縮是zigzag算法須要解決的問題。blog
算法規則以下:get
一、將數值的符號位移動到第1位,數據位左移一位;it
二、對於正數數值位不變,負數按位取反;基礎
算法的代碼以下:二進制
編碼:(i >> 31) ^ (i << 1)數據
解碼:((i >>> 1) ^ -(i & 1))
這裏異或運算很巧妙,能夠參考「 java位運算--基礎(不按期更新)」
以-1爲例11111111_11111111_11111111_11111111通過zigzag編碼後爲00000000_00000000_00000000_00000001=1,
最後使用Vint壓縮只佔用1個字節。