Data.Word.Zigzag

zigzag-0.1.0.0: Zigzag encoding of integers into unsigned integers.

Safe Haskell | Safe-Inferred
Language | Haskell2010

Data.Word.Zigzag

Description

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 < 0

This description was adapted from https:/developers.google.comprotocol-buffersdocsencoding#signed-ints which is released under https://creativecommons.org/licenses/by/4.0/

Synopsis

- toZigzag :: Integer -> Natural
- fromZigzag :: Natural -> Integer
- toZigzagNative :: Int -> Word
- fromZigzagNative :: Word -> Int
- toZigzag32 :: Int32 -> Word32
- fromZigzag32 :: Word32 -> Int32
- toZigzag64 :: Int64 -> Word64
- fromZigzag64 :: Word64 -> Int64

# Documentation

toZigzag :: Integer -> Natural #

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`.

fromZigzag :: Natural -> Integer #

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`.

toZigzagNative :: Int -> Word #

Encode a native-size integer with zigzag.

In C, this is:

    (n << 1) ^ (n >> (CHAR_BIT * sizeof(int) - 1))

fromZigzagNative :: Word -> Int #

Decode a native-size zigzag-encoded integer.

In C, this is:

    (n >> 1) ^ (~(n & 1) + 1)

toZigzag32 :: Int32 -> Word32 #

Encode a 32-bit integer with zigzag.

In C, this is:

    (n << 1) ^ (n >> 31)

fromZigzag32 :: Word32 -> Int32 #

Decode a 32-bit zigzag-encoded integer.

In C, this is:

    (n >> 1) ^ (~(n & 1) + 1)

toZigzag64 :: Int64 -> Word64 #

Encode a 64-bit integer with zigzag.

In C, this is:

    (n << 1) ^ (n >> 63)

fromZigzag64 :: Word64 -> Int64 #

Decode a 64-bit zigzag-encoded integer.

In C, this is:

    (n >> 1) ^ (~(n & 1) + 1)