ZigZag編碼
在網絡傳輸和數據存儲場景中,需要對數據進行壓縮。數據壓縮的算法非常多,但大部分的數據壓縮算法的原理是通過某種編碼方式不存儲數據中的0比特位,因此0比特位越多,數據壓縮的效果越好。ZigZag編碼就是一種增加0比例位的編碼方式。下面使用Java語言來描述ZigZag編碼。
一、編碼
正數
假設數據類型爲byte的正數11,其二進制表示爲:00001011
數據左移一位:
00010110
符號位(正數的符號爲0)放到最後一位:
00010110
負數
假設數據類型爲byte的負數-11,其二進制在計算機中是用補碼錶示的,計算過程如下。
正數原碼:00001011
。
反碼:11110100
補碼(反碼加1):11110101
處理過程:
左移一位:
11101010
符號位放到最後一位:
11101011
除最後一位外全部取反:
00010101
結論
正數經過處理後,前導0和後置0的個數不變。但是負數經過處理後,增加了三個前導0,可以用於壓縮。
結合兩種情況得出byte類型數據的編碼公式:
ZigZag(n) = n>>7 ^ n<<1
-11的處理過程如下:
11110101 >> 7 = 11111111
11110101 << 1 = 11101010
11111111^11101010 = 00010101
二、解碼
ZigZag的逆函數:
ZigZag−1(n)ZigZag−1(n)=(n>>>1)^ -(n&1)
負數00010101
的解碼過程:
n>>>1:
00001010
n&1:
00000001
-(n&1):
11111111
1111111^0000101=11110101