Varint编码和zigzag算法

为啥出现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

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值