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的逆函數:

\(ZigZag^{-1}(n)\)=(n>>>1)^ -(n&1)

負數00010101的解碼過程:

  1. n>>>1:00001010

  2. n&1:00000001

  3. -(n&1):11111111

  4. 1111111^0000101=11110101


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM