#bit #iterator #convert #bitvec #bitstring #no-alloc

无 std itybity

提供位迭代器和位迭代器附件的小型 crate

9 个版本

0.2.1 2023 年 7 月 21 日
0.2.0 2023 年 7 月 5 日
0.1.6 2023 年 6 月 17 日

编码类排名 502

Download history 158/week @ 2024-04-22 322/week @ 2024-04-29 238/week @ 2024-05-06 102/week @ 2024-05-13 187/week @ 2024-05-20 101/week @ 2024-05-27 166/week @ 2024-06-03 173/week @ 2024-06-10 139/week @ 2024-06-17 762/week @ 2024-06-24 472/week @ 2024-07-01 340/week @ 2024-07-08 287/week @ 2024-07-15 404/week @ 2024-07-22 226/week @ 2024-07-29 353/week @ 2024-08-05

每月下载 1,278

MIT/Apache

48KB
1K SLoC

itybity

Crates.io Docs.rs CI

感觉有点可迭代?

这是一个提供位迭代器和位迭代器附件的小型 crate。

无依赖,无不安全,且与 #![no_std] 兼容。

摘要

该 crate 提供了遍历各种类型(包括整数、切片和字符串)的位的迭代器。这些迭代器可以通过提供的扩展特质方便地访问,例如 ToBitsIntoBitsStrToBits

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,用于 VecString 类型。

许可证

根据以下其中一种许可证授权

由您选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在作品中的任何贡献,将按上述方式双重许可,不附加任何额外的条款或条件。

参见 CONTRIBUTING.md

依赖关系

~0–265KB