數值壓縮儲存方法Varint

2022-01-13 17:08:21 字數 1856 閱讀 3794

varint 是一種緊湊的表示數字的方法。它用乙個或多個位元組來表示乙個數字,值越小的數字使用越少的位元組數。這能減少用來表示數字的位元組數。比如對於 int32 型別的數字,一般需要 4 個 byte 來表示。但是採用 varint,對於很小的 int32 型別的數字,則可以用 1 個 byte 來表示。當然凡事都有好的也有不好的一面,採用 varint 表示法,大的數字則需要 5 個 byte 來表示。從統計的角度來說,一般不會所有的訊息中的數字都是大數,因此大多數情況下,採用 varint 後,可以用更少的位元組數來表示數字資訊。下面就詳細介紹一下 varint。

varint 中的每個 byte 的最高位 bit 有特殊的含義,如果該位為 1,表示後續的 byte 也是該數字的一部分,如果該位為 0,則結束。其他的 7 個 bit 都用來表示數字。因此小於 128 的數字都可以用乙個 byte 表示。大於 128 的數字,比如 300,會用兩個位元組來表示:1010 1100 0000 0010

由於負數的高位為1,所以採用這種壓縮處理的時候必須負數轉成正數,可以通過以下**實現int to uint的轉換

private static int zag(uint ziggedvalue)

private static uint zig(int value)

以下操作是對乙個uint進行編碼處理

private static arraysegmentwriteuint32variant(uint value)

while ((value >>= 7) != 0);

data[count - 1] &= 0x7f;

return new arraysegment(data, 0, count);

}

data[count] = (byte)((value & 0x7f) | 0x80);   得到頭7位的數值, | 0x80是表明後面的byte也是數字的一部分。

while ((value >>= 7) != 0)    右移7位如果不為零的情況下則繼續上面的工作。

data[count - 1] &= 0x7f 把最後byte的最高位設定成0;

接下來就是乙個uint的解碼過程

private static uint readuint32variant(arraysegmentdata)

(value & 0x80) == 0 表示最高位為0,說明後面的byte已經不是數值組成部分。

(chunk & 0xf0) == 0 chunk只有4位,如果不是則表明這個byte不是數值儲存的一部分。

測試一下看下編碼效果

arraysegmentdata = writeuint32variant(zig(0));

console.writeline(data.count);

data = writeuint32variant(zig(567));

console.writeline(data.count);

data = writeuint32variant(zig(10000));

console.writeline(data.count);

data = writeuint32variant(zig(-100000));

console.writeline(data.count);

分別是1byte,2byte,3byte,3byte

其實有人會有凝問,為什麼不根據情況來用int16等來儲存,如果一旦用了int16就說明以後需要轉int32就是件非常麻煩的事情,雙方程式都需要調整。如果採用varint進行處理就能達到最好擴充套件效果和頻寬利用率.

varint 數值壓縮儲存

varint 是一種緊湊的表示數字的方法。它用乙個或多個位元組來表示乙個數字,值越小的數字使用越少的位元組數。這能減少用來表示數字的位元組數。比如對於 int32 型別的數字,一般需要 4 個 byte 來表示。但是採用 varint,對於很小的 int32 型別的數字,則可以用 1 個 byte ...

矩陣壓縮儲存

在c中矩陣的表示是用二維陣列。那麼首先要搞清楚陣列行列與矩陣行列的對應。在c語言中二維陣列是按行儲存的。即順序儲存每一行。第一行,第二行。最後一行 看一下例子 陣列數量替換成arrs i j 方便說明。int arrs i j test 二維陣列記憶體位置 for i 0 i 3 i 在上例中i表示...

矩陣壓縮儲存

矩陣乘法 原始碼十字鍊錶 const int max size 1000 const int max size of row 100 typedef struct triple typedef struct rltmatrix 三元組順序表 rltmatrix行列交換 重新排序 普通方法 按列查詢 ...