From "Signed Types" on Кодирование - Буферы протокола - Google Code :
Кодирование ZigZag преобразует целые числа со знаком в целые числа без знака, так что числа с небольшим абсолютным значением (например, -1) также имеют небольшое значение в кодировке varint. Он делает это таким образом, что "зигзагообразно перемещается" вперед и назад по положительным и отрицательным целым числам, так что -1 кодируется как 1, 1 кодируется как 2, -2 кодируется как 3 и так далее, как вы можно увидеть в следующей таблице:
Подписанный оригинал, закодированный как 0 0 -1 1 1 2 -2 3 2147483647 4294967294 -2147483648 4294967295
Другими словами, каждое значение n кодируется с использованием
(n > 31)
для sint32s или
(n > 63)
для 64-битной версии.
Как (n > 31)
совпадает с данными в таблице? Я понимаю, что это сработает для положительных результатов, но как это работает, скажем, для -1? Разве -1 не было бы 1111 1111
, а (n было
1111 1110
? (Сдвиг битов на негативе правильно сформирован на каком-либо языке?)
Тем не менее, используя фомулу и выполняя (- 1 > 31)
, предполагая, что 32- bit int, я получаю 1111 1111
, что составляет 4 миллиарда, тогда как таблица считает, что у меня должен быть 1.