在 google protocol buffers encoding overview中,他们引入了一种称为“Zig Zag Encoding”的东西,它采用小幅度的有符号数字,并创建一系列小幅度的无符号数字。
例如
Encoded => Plain
0 => 0
1 => -1
2 => 1
3 => -2
4 => 2
5 => -3
6 => 3
等等。他们为此提供的编码功能相当聪明,它是:
(n << 1) ^ (n >> 31) //for a 32 bit integer
我了解它是如何工作的,但是,我终其一生都无法弄清楚如何将其反转并将其解码回有符号的 32 位整数