Encode a big integer with zigzag.
If you know the size of the data, it is likely more efficient to use one of toZigzagNative, toZigzag32, or toZigzag64.
:: a typeCtrl KGHC 9.10.3 · lts/ghc-9.10.x · 248f8f0 · 2026-10-05
Modulezigzag-0.1.0.0Haskell2010
Zigzag encoding maps signed integers to unsigned integers so that numbers with a small absolute value (for instance, -1) have a small varint encoded value too. It does this in a way that "zig-zags" back and forth through the positive and negative integers, so that -1 is encoded as 1, 1 is encoded as 2, -2 is encoded as 3, and so on.
zigzag(n) = { 2 * n if 0 <= n
{ -2 * n - 1 if n < 0This description was adapted from https:/developers.google.comprotocol-buffersdocsencoding#signed-ints which is released under https://creativecommons.org/licenses/by/4.0/
Encode a big integer with zigzag.
If you know the size of the data, it is likely more efficient to use one of toZigzagNative, toZigzag32, or toZigzag64.
Decode a zigzag-encoded big ingeter.
If you know the size of the data, it is likely more efficient to use one of fromZigzagNative, fromZigzag32, or fromZigzag64.
Encode a native-size integer with zigzag.
In C, this is:
(n << 1) ^ (n >> (CHAR_BIT * sizeof(int) - 1))Decode a native-size zigzag-encoded integer.
In C, this is:
(n >> 1) ^ (~(n & 1) + 1)Encode a 32-bit integer with zigzag.
In C, this is:
(n << 1) ^ (n >> 31)Decode a 32-bit zigzag-encoded integer.
In C, this is:
(n >> 1) ^ (~(n & 1) + 1)Encode a 64-bit integer with zigzag.
In C, this is:
(n << 1) ^ (n >> 63)Decode a 64-bit zigzag-encoded integer.
In C, this is:
(n >> 1) ^ (~(n & 1) + 1)