【发布时间】:2010-12-26 07:27:39
【问题描述】:
来自Encoding - Protocol Buffers - Google Code上的“签名类型”:
ZigZag 编码将有符号整数映射到无符号整数,因此具有较小绝对值(例如 -1)的数字也具有较小的 varint 编码值。它以一种通过正整数和负整数来回“曲折”的方式来执行此操作,因此 -1 被编码为 1,1 被编码为 2,-2 被编码为 3,依此类推,就像你可以看下表:
Signed Original Encoded As 0 0 -1 1 1 2 -2 3 2147483647 4294967294 -2147483648 4294967295换句话说,每个值 n 都是使用编码的
(n << 1) ^ (n >> 31)对于 sint32s,或
(n << 1) ^ (n >> 63)适用于 64 位版本。
(n << 1) ^ (n >> 31) 如何等于表中的内容?我知道这对积极因素有用,但是对于-1来说,这如何工作? -1 不是1111 1111,(n << 1) 不是1111 1110? (在任何语言中,对负数的移位是否格式正确?)
尽管如此,使用公式并执行 (-1 << 1) ^ (-1 >> 31),假设是 32 位 int,我得到 1111 1111,即 40 亿,而表格认为我应该有 1。
【问题讨论】:
标签: protocol-buffers bit-shift zigzag-encoding