我想知道为什么在用可变长度编码Ints时必须在Trift CompactProtocol中交换字节。
示例取自数据密集型应用程序(在线,第120页):
Number in Base 10 to be encoded: 1337
1337 in Base 2: 0010100 111001
Encoding first byte: 1|111011|0
Encoding second byte: 0|0010100
如您所见,字节已被交换。为什么?
附加信息:第一个字节中的第一位表示还有一个字节要到来。第一个字节中的最后一位表示符号(在这种情况下为正)。最后一个符号中的第一位表示不再有属于此数字的额外字节。
这是对小整数进行编码的有效方法,或者更准确地说,用小的绝对值进行编码。这个想法在protobuf文档中得到了很好的解释:
ZigZag编码将有符号整数映射为无符号整数,以便绝对值较小的数字(例如-1)的variant编码的值也是。它以一种"之字形"后退的方式做到了这一点通过正整数和负整数,因此-1是编码为1,1编码为2,-2编码为3,依此类推可以在下表中看到〔…〕
小的绝对值是一种非常常见的情况。较大的值很少出现。因此,对于大多数用例,我们会携带大量(不必要的)零,而没有附加值。不幸的是,对于负值,它有点复杂,因为我们必须关心符号位。
ZigZag算法以一种非常优雅和高效的方式处理了这一问题。