9 个版本
0.2.1 | 2023 年 7 月 21 日 |
---|---|
0.2.0 | 2023 年 7 月 5 日 |
0.1.6 | 2023 年 6 月 17 日 |
编码类排名 502
每月下载 1,278 次
48KB
1K SLoC
itybity
感觉有点可迭代?
这是一个提供位迭代器和位迭代器附件的小型 crate。
无依赖,无不安全,且与 #![no_std]
兼容。
摘要
该 crate 提供了遍历各种类型(包括整数、切片和字符串)的位的迭代器。这些迭代器可以通过提供的扩展特质方便地访问,例如 ToBits
、IntoBits
和 StrToBits
。
FromBits
特质为从位迭代器解析类型提供了实现。
性能
该 crate 并未以性能为目标进行设计,而是以简洁为目标。对于更高效且内存高效的替代方案,请参阅 bitvec
。
尽管如此,该 crate 中的迭代器仍然相当快速且紧凑。
位序
请注意不要混淆位序和字节序(大小端)。位序是指位在容器中的位置顺序。有关更多信息,请参阅 此维基。
传统上,位是从右到左书写的,即最低有效位在右侧。然而,在处理位向量时,通常更直观地将最低有效位放置在索引 0 处,即最左侧或 Lsb0 顺序。
例如,数字 69 的二进制表示为 01000101
,在 Lsb0 中对应以下位向量
[1, 0, 1, 0, 0, 0, 1, 0]
在 Msb0 中对应以下
[0, 1, 0, 0, 0, 1, 0, 1]
用法
首先,将以下内容添加到您的 Cargo.toml
[dependencies]
itybity = "0.2"
示例
use itybity::{ToBits, IntoBits, FromBitIterator, StrToBits};
let byte = 0b1010_1010u8;
// Convert to a Vec<bool> in Lsb0 order.
let bits = byte.to_lsb0_vec();
assert_eq!(bits, vec![false, true, false, true, false, true, false, true]);
// Writing a bit vector using bools is a pain, use a string instead
//
// Notice that the string is written in Msb0 order, and we reverse it to Lsb0.
let expected_bits = "10101010".iter_bits().rev().collect::<Vec<bool>>();
assert_eq!(bits, expected_bits);
// Convert back to a u8.
let new_byte = u8::from_lsb0_iter(bits);
assert_eq!(byte, new_byte);
// We can work with slices too
let bytes = vec![0u8, 1u8, 2u8, 3u8];
// Create an iterator over the bits in Msb0 order.
let bits = bytes.iter_msb0();
assert_eq!(bits.len(), 32);
// Convert back to a different type
let data = u32::from_msb0_iter(bits);
// If we have an iterator of values, we can map it to an iterator of bits.
let iter = vec![0u8, 1u8, 2u8, 3u8].into_iter();
let bit_iter = iter.flat_map(IntoBits::into_iter_lsb0);
// And we can parse it back
let values = Vec::<u8>::from_lsb0_iter(bit_iter);
assert_eq!(values, vec![0u8, 1u8, 2u8, 3u8]);
// We can do the same with arrays. Notice that the array is longer, so the last element
// will be 0.
let values = <[u8; 5]>::from_lsb0_iter(values.iter_lsb0());
assert_eq!(values, [0u8, 1u8, 2u8, 3u8, 0u8]);
特性
itybity
通过禁用默认特性来支持 #[no_std]
。
std
:启用alloc
,用于Vec
和String
类型。
许可证
根据以下其中一种许可证授权
- Apache License,版本 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在作品中的任何贡献,将按上述方式双重许可,不附加任何额外的条款或条件。
参见 CONTRIBUTING.md。
依赖关系
~0–265KB