Буферы протокола Google: Зигзагообразное кодирование

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.

19
задан Charles 2 July 2013 в 19:29
поделиться