#位集 #位数组 #布尔 #固定 #保持 #整数 #能够

无需 std cbitset

能够在一个整型数组中保持一定数量的布尔值

2 个不稳定版本

使用旧的 Rust 2015

0.2.0 2019 年 5 月 26 日
0.1.0 2018 年 9 月 22 日

无需标准库 中排名第 113

Download history 1677/week @ 2024-03-14 1783/week @ 2024-03-21 2017/week @ 2024-03-28 1825/week @ 2024-04-04 1849/week @ 2024-04-11 1912/week @ 2024-04-18 1496/week @ 2024-04-25 1901/week @ 2024-05-02 1942/week @ 2024-05-09 2051/week @ 2024-05-16 2059/week @ 2024-05-23 2222/week @ 2024-05-30 2310/week @ 2024-06-06 2466/week @ 2024-06-13 2696/week @ 2024-06-20 2101/week @ 2024-06-27

每月下载量 9,942
23 个 Crates 中使用(直接使用 2 个)23 个 Crates

MIT 许可证

19KB
334

cbitset Crates.io

能够在一个整型数组中保持一定数量的布尔值。

替代方案

已经有了很多位集库,但我似乎找不到一个能够与固定大小数组一起工作的 #![no_std] 库。它们中的大多数似乎都想要动态的。

cbitset 还也是 repr(transparent),这意味着结构的表示形式保证与内部数组相同,使其可以在结构表示形式很重要的地方使用,例如 relibc

灵感来源

我认为这在 C 中相对常见,因为我偶然在 MUSL 标准库中发现了这个概念。一个例子是在 strspn 中的使用。

虽然这是一个相对简单的概念,但实现可能相当难以阅读。所以也许应该使用某种……零成本抽象来将其抽象化?

示例

位集非常便宜。你可以在一个 4x 64 位数字的数组中存储从 0 到 255 的任何数字。理论上查找应该是 O(1)。这里有一个使用这个库的 strspn 示例。这是在 Rust 中使用此库的方式

/// The C standard library function strspn, reimplemented in rust. It works by
/// placing all allowed values in a bit set, and returning on the first
/// character not on the list. A BitSet256 uses no heap allocations and only 4
/// 64-bit integers in stack memory.
fn strspn(s: &[u8], accept: &[u8]) -> usize {
    let mut allow = BitSet256::new();

    for &c in accept {
        allow.insert(c as usize);
    }

    for (i, &c) in s.iter().enumerate() {
        if !allow.contains(c as usize) {
            return i;
        }
    }
    s.len()
}

依赖项

~155KB