整形數值壓縮---Vint與zigzag

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個字節。

相關文章
相關標籤/搜索