http://blog.csdn.net/csfreebird/article/details/7624807
varints用于正整数 (无符号整数)
varints 是 一个很不错的技术。将一个整数序列化成1或者多个字节。想起以前我们总是使用4字节表示整数,真的很浪费啊。只有真正追求完美的人才会重视每个细节。
我的本篇介绍是https://developers.google.com/protocol-buffers/docs/encoding中的Base 128 Varints一节的逆过程。这么好的站点被墙了,幸好我有VPN。
规则:
1.如果整数可以用一个字节表示,不要改变它
2.否则,用上面的4步序列化
3.每个字节最高位叫msb(most significant bit),1表示后面有字节,0表示后面没有字节。
ZigZag用于负整数(有符号的整数)
但是这种varints encoding算法用来处理负数是不合适的。因为它会把负数当作很大的正数,从而通常序列化成10字节。显然效率比较低。
遇到负数的时候,应该采用另一种encoding算法。
如果是32位符号负整数,用
(n << 1) ^ (n >> 31)
64位符号负整数,用
(n << 1) ^ (n >> 61)
注意,这些移位都是arithmetic shift,也就是左移补0,右移补符号位。
注意,当protocol buffer编译器看到你的类型是sint32或者sint64,它才会用ZigZag编码。所以你要清楚你使用这两个类型的意义。通常我只用来处理负整数。