ZigZag編碼

ZigZag編碼

在網絡傳輸和數據存儲場景中,需要對數據進行壓縮。數據壓縮的算法非常多,但大部分的數據壓縮算法的原理是通過某種編碼方式不存儲數據中的0比特位,因此0比特位越多,數據壓縮的效果越好。ZigZag編碼就是一種增加0比例位的編碼方式。下面使用Java語言來描述ZigZag編碼。

一、編碼

正數

假設數據類型爲byte的正數11,其二進制表示爲:00001011

  1. 數據左移一位:00010110

  2. 符號位(正數的符號爲0)放到最後一位:00010110

負數

假設數據類型爲byte的負數-11,其二進制在計算機中是用補碼錶示的,計算過程如下。

正數原碼:00001011

反碼:11110100

補碼(反碼加1):11110101

處理過程:

  1. 左移一位:11101010

  2. 符號位放到最後一位:11101011

  3. 除最後一位外全部取反:00010101

結論

正數經過處理後,前導0和後置0的個數不變。但是負數經過處理後,增加了三個前導0,可以用於壓縮。

結合兩種情況得出byte類型數據的編碼公式:

ZigZag(n) = n>>7 ^ n<<1

-11的處理過程如下:

  1. 11110101 >> 7 = 11111111

  2. 11110101 << 1 = 11101010

  3. 11111111^11101010 = 00010101

二、解碼

ZigZag的逆函數:

ZigZag1(n)ZigZag−1(n)=(n>>>1)^ -(n&1)

負數00010101的解碼過程:

  1. n>>>1:00001010

  2. n&1:00000001

  3. -(n&1):11111111

  4. 1111111^0000101=11110101

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章