为啥出现varint编码?
Varint编码是变长的标识int32或者int64等数据,所以在流量优化中比较常见,
原本4byte标识的int32 经过varint编码之后 可能变成1byte 或者 5byte ,这个取决于int32的值大小
原理
varint编码是一个byte 中8个bit ,用一个bit来表示后面的byte是否连续,如果是1,就表示后面的byte还是这个int32的其中一部分,如果是0表示数据结束了,这个bit也叫msb(most significant bit - msb)
比方说 数字 12345678
所以数值越小,所用的空间就会越小.
但是,如果是负数的时候,所占用的空间就会很大,因此就需要将负数全部映射到正数中.
zigzag算法可以很有效率的处理这个事情.
啥时zigzag算法?
原本的-1 用 1来表示 ,原本的1用2来表示,别看这个很复杂,但是编码解码的公式却非常的简单.
这个是java中的代码,其中 ">>>" 表示逻辑位移.
算术位移和逻辑位移的区别
•逻辑移位 >>>
对于逻辑移位,就是不考虑符号位,移位的结果只是数据所有的位数进行移位。根据移位操作的目的,左移时,低位补0,右移时,高位补0;
•算术移位 >>
正数无论左移还是右移都是补0.而负数的补码就需要注意,左移在右边补0,右移需要在左边补1,
比如8位机器数(补码):1,110 0110,右移一位是:1,111 0011