#unsigned-integer #signed-integer #zigzag #codec #decoding #converting

residua-zigzag

一个使用zigzag编码和解码来在有符号整数和无符号整数之间进行转换的库

1个不稳定版本

0.1.0 2021年4月24日

#2169 in 编码

Download history 1468/week @ 2024-03-14 1823/week @ 2024-03-21 2033/week @ 2024-03-28 2006/week @ 2024-04-04 2029/week @ 2024-04-11 1954/week @ 2024-04-18 1701/week @ 2024-04-25 1579/week @ 2024-05-02 1410/week @ 2024-05-09 1391/week @ 2024-05-16 1285/week @ 2024-05-23 1436/week @ 2024-05-30 1303/week @ 2024-06-06 1133/week @ 2024-06-13 1149/week @ 2024-06-20 842/week @ 2024-06-27

4,623 每月下载量
6 个crate中使用了(通过 bitcode_lightyear_patch

MIT 许可证

7KB

zigzag  构建状态 最新版本

一个使用zigzag编码和解码来在有符号整数和无符号整数之间进行转换的库。docs.rs 上查看文档 这里.

许可证

此crate可以在MIT许可证的条款下以开源形式使用。


lib.rs:

一个crate,它公开了两个准扩展特性,分别使用ZigZagEncode特性扩展有符号整数,使用ZigZagDecode特性扩展无符号整数。

Zigzag编码

Zigzag编码将一个有符号整数编码为一个无符号整数。它是通过从零开始计数,交替表示正数和负数来实现的。

要使用表示长度——以位为单位,n——编码任何有符号整数x,公式如下

(x >> n - 1) ^ (x << 1)

注意:操作符^不是指数运算;而是位异或运算。

例如,将值x的简化公式编码为32位有符号整数如下

(x >> 31) ^ (x << 1)

Zigzag解码

要将zigzag编码的无符号整数x转换为它的解码有符号等价物,公式如下

(x >>> 1) ^ -(x & 1)

注意:代码中的 >>> 操作符表示逻辑右移,而不是算术右移。在 Rust 中,无符号整数类型将右移操作符实现为逻辑右移,而不是算术右移。因此,Rust 中的公式简化为 (x >> 1) ^ -(x & 1)

示例

编码有符号整数

use zigzag::ZigZagEncode;

assert_eq!(0i8.zigzag_encode(), 0u8);
assert_eq!((-1i8).zigzag_encode(), 1u8);
assert_eq!(1i8.zigzag_encode(), 2u8);

assert_eq!(i8::MIN.zigzag_encode(), u8::MAX);
assert_eq!(i16::MIN.zigzag_encode(), u16::MAX);
assert_eq!(i32::MIN.zigzag_encode(), u32::MAX);
assert_eq!(i64::MIN.zigzag_encode(), u64::MAX);
assert_eq!(i128::MIN.zigzag_encode(), u128::MAX);

assert_eq!(isize::MIN.zigzag_encode(), usize::MAX);

解码无符号整数

use zigzag::ZigZagDecode;

assert_eq!(0u8.zigzag_decode(), 0i8);
assert_eq!(1u8.zigzag_decode(), -1i8);
assert_eq!(2u8.zigzag_decode(), 1i8);

assert_eq!(u8::MAX.zigzag_decode(), i8::MIN);
assert_eq!(u16::MAX.zigzag_decode(), i16::MIN);
assert_eq!(u32::MAX.zigzag_decode(), i32::MIN);
assert_eq!(u64::MAX.zigzag_decode(), i64::MIN);
assert_eq!(u128::MAX.zigzag_decode(), i128::MIN);

assert_eq!(usize::MAX.zigzag_decode(), isize::MIN);

无运行时依赖