1个不稳定版本
0.1.0 | 2021年4月24日 |
---|
#2169 in 编码
4,623 每月下载量
在 6 个crate中使用了(通过 bitcode_lightyear_patch)
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);