Вот еще один способ сделать то же самое, только для пояснения (очевидно, вы должны использовать однострочник 3lectrologos).
Вы просто должны заметить, что вы xor с числом, которое либо все 1 (эквивалентно поразрядному нет), либо все 0 (эквивалентно бездействию). Это то, что (-(n & 1))
дает, или то, что объясняется "арифметическим сдвигом" Google.
int zigzag_to_signed(unsigned int zigzag)
{
int abs = (int) (zigzag >> 1);
if (zigzag % 2)
return ~abs;
else
return abs;
}
unsigned int signed_to_zigzag(int signed)
{
unsigned int abs = (unsigned int) signed << 1;
if (signed < 0)
return ~abs;
else
return abs;
}
Таким образом, чтобы иметь множество нулей в наиболее значимых позициях, зигзагообразное кодирование использует младший бит как знаковый бит, а остальные биты - как абсолютное значение (фактически только для положительных целых чисел, и абсолютное значение -1 для отрицательных чисел из-за в дополнение к представлению 2).