В буферах протокола google обзор кодировки они вводят что-то под названием "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-битные целые числа