1.varint 介紹
Varint 是一種緊湊的表示數字的方法。它用一個或多個字節來表示一個數字,值越小的數字使用越少的字節數。這能減少用來表示數字的字節數。比如對於 int32 類型的數字,一般需要 4 個 byte 來表示。但是採用 Varint,對於很小的 int32 類型的數字,則可以用 1 個 byte 來表示
2.詳解
2.1 最高位:
Varint 中的每個 byte 的最高位 bit 有特殊的含義,如果該位爲 1,表示後續的 byte 也是該數字的一部分,如果該位爲 0,則結束。其他的 7 個 bit 都用來表示數字。因此小於 128 的數字都可以用一個 byte 表示。大於 128 的數字,比如 300,會用兩個字節來表示:1010 1100 0000 0010
2.2負數
由於負數的高位爲1,所以採用這種壓縮處理的時候必須負數轉成正數,可以通過以下代碼實現int to uint的轉換
private static int Zag(uint ziggedValue)
{
int value = (int)ziggedValue;
return (-(value & 0x01)) ^ ((value >> 1) & ~( 1<< 31));
}
private static uint Zig(int value)
{
return (uint)((value << 1) ^ (value >> 31));
}