#位操作 #宽度 #向量

grit-bitvec

提供 BitVec,一种可以存储固定宽度数据且位宽不规则的向量类型

4 个版本

0.4.3 2023 年 7 月 27 日
0.4.2 2023 年 7 月 27 日
0.3.6 2023 年 7 月 20 日
0.2.0 2023 年 7 月 12 日
0.1.1 2023 年 7 月 7 日

#908 in 数据结构

Download history 8/week @ 2024-03-10 7/week @ 2024-03-17 72/week @ 2024-03-31

每月 70 次下载

BSD-3-Clause

275KB
3.5K SLoC

grit-bitvec

此软件包提供 BitVec 数据结构的变体,这是一个可以存储不属 8/16/32/64/128 大小类别的固定大小位宽数据元素的向量。例如,你不必将每个布尔值存储在一个字节的向量中,而是可以将其存储为一位。另一个例子是将范围在 0-3 的无符号整数存储为正好 2 位,0-7 为 3 位,0-15 为 4 位,甚至可以将范围在 -1024 到 1023 的有符号整数存储为 11 位,或者将一个具有 4 个布尔值和 1 个 u8 的结构体(范围在 0-7)存储为总共 7 位。

  • RawBitVec:所有其他变体封装的基础结构。需要将 BitProto 传递给每个函数,如果同一个 RawBitVec 实例上的所有方法调用没有使用相同的 BitProto,则是不安全的。
  • CProtoBitVec<BIT_WIDTH>:一个包装器,它将所需的 BitProto 存储在为每个单独的 <BIT_WIDTH> 创建的单态化常量中。
  • SProtoBitVec:一个包装器,在每个实例中保持对所需的 BitProto 的静态引用。
  • LProtoBitVec:一个包装器,在每个实例中保持对 BitProto 的完整副本。
  • 类型化的位向量TypedBitVec<T>:一个包装器,不仅存储了BitProto,而且还包括将原始返回位转换为类型<T>所需的函数

所有版本都使用usize作为底层数据块类型,以利用对本地大小字的任何可能的算术优化,这意味着支持的位宽最大与usize::BITS

这允许在元素数量可能很大的应用中显著提高内存使用效率,但会以访问元素的处理时间为代价。

附加的处理成本在大多数情况下并不严重,因为大多数操作都是通过位操作和简单的算术来完成的,并且在使用常数传播时还可以进一步减少许多位操作函数的复杂度。然而,它们并不是免费的,并且在BitVec中间插入或删除元素的运算可能会更昂贵,因为需要为每个元素运行这些检查和位移,而不是像ptr::copy()那样在内部使用Vec

默认情况下,启用了small_int_impls功能,为bool和小于16位的整数类型(例如u8_as_u3i16_as_i11)提供了简单的TypedBitElem实现,可以通过激活large_int_impls功能来获取小于usize::BITS的位宽的类似实现

已测试的函数

  • new()
  • with_capacity()
  • len()
  • cap()
  • free()
  • clear()
  • grow_exact_for_total_elements_if_needed()
  • grow_exact_for_additional_elements_if_needed()
  • grow_for_total_elements_if_needed()
  • grow_for_additional_elements_if_needed
  • push()
  • pop()
  • insert()
  • remove()
  • insert_bitvec()
  • insert_iter()
  • remove_range()
  • trim_range()
  • swap()
  • swap_pop()
  • shrink_excess_capacity()
  • append_bitvec()
  • append_iter()
  • get()
  • set()
  • replace()
  • drain()
  • into_iter()
  • discard_from_end()

该crate目前文档不完整,处于“不稳定”阶段。API将来可能会有变化

没有运行时依赖

功能