#bits #bit #bit-fields #byte #binary #read-write #bitfields

nightly no-std bitman

为Rust提供易于使用的位操作库

3个稳定版本

2.0.1 2023年8月17日
2.0.0 2023年8月12日
1.0.0 2022年4月21日

#1724 in 编码

MIT 协议

97KB
1K SLoC

bitman

将变量拆分为位

概述

bitman提供了一种读取和写入变量单独位的方法,以及定义可以按任何类型读取或写入的变量内字段的 capability。

项目愿景

我们对bitman的愿景是一套简单直观的工具,允许高效地与类型的基本位和子字段进行交互,这些类型通常不提供这种访问。

用法

bitman设计得尽可能易于使用,同时不牺牲速度。为此,我们在所有Rust原生日积类型中添加了to_bits()方法。让我们通过查看一个名为my_u8的u8来了解如何创建Bits。

  • my_u8.to_bits()将u8转换为Bits类型。Bits创建了一个u8的包装器,提供了更多方法。因此,my_u8.to_bits()调用最初的成本非常低。它只是将u8复制到Bits类型中。

    (注意:为了更明确的错误,请尝试to_named_bits())

  • my_u8.to_bits()还从内部u8提取一个vec。然后,将得到的vec存储在Bits变量中,以帮助更快地检索位。(注意:当前,此优化已禁用。我在解决线程代码中引起竞态条件的错误。使用此代码的代码仍将正常工作,但速度不会像优化重新启用时那样快。)

在Bits中写入或读取位是通过索引完成的。我将从一个u8创建一个Bits实例来演示

use bitman::AnyIntegerType;
let mut my_u8 = 0u8;
let mut my_bits = my_u8.to_bits();      // to_bits() makes it easy to make a Bits.
my_bits[0] = true;                      // Setting a bit is easy as pie.
assert_eq!(my_bits[0], true);           // Reading a single bit is easy too!
assert_eq!(my_bits.as_integer(), 128);  // Need to read the integer?  Easy peasy!

这真的非常简单!

您甚至可以将bools的切片分配到Bits的切片,它将正常工作而不会影响任何其他位!

my_bits[0..2].copy_from_slice(&[true, false]);

当然,您也可以将Bits的切片分配到Bits的切片!

my_bits[2..4].copy_from_slice(my_bits[0..2]);

Bits类型也是可迭代的,因此您可以轻松地迭代Bits中的每个Bit

for bit in my_bits {
  println!("{:?}", bit);
}

当然,您也可以可变地迭代Bits,如果需要的话

for mut bit in my_bits {
  bit = !bit;
}

开发者信息

自动化工具

我们通过Git钩子在每次提交时自动运行git cliff来生成CHANGELOG.md文件。这确保了变更日志在开发过程中保持最新。我们已添加一个Git钩子,以便在每次提交时启动git cliff。请参阅.git/hooks/post-commit以获取钩子代码。

路线图

多线程

在创建bitman时,我们将其编写为完全支持多线程。这种多线程通过排队任何更改并在后台更新它们,使库的速度大大提高。然而,使数据源(位向量)自动从一种(从整数本身动态提取的位)切换到另一种(位向量)并返回的锁定机制最终证明是问题的,需要废弃并重新实现,以避免在同时更新整数和位向量时出现竞争条件。这些更改不应影响bitman的接口,因此不会造成破坏性变更或以任何方式影响使用bitman的任何代码。

向量与数组支持

bitman最初的设计目标之一是除了支持单个原始整数之外,还支持原始整数的向量和数组。在开发bitman期间,这个目标不得不被搁置,因为它需要比我们目前的时间更多的规划。然而,我们仍然计划将此功能添加到bitman中。这些更改只会增加bitman的接口,因此不会造成破坏性变更或以任何方式影响使用bitman的任何代码。

序列化/反序列化支持

我们意识到自动序列化和反序列化整个Bits实例以及Bits实例的整数表示将非常有价值。不幸的是,我们还没有时间编写那段代码。它只会增加bitman的接口,因此不会造成破坏性变更或以任何方式影响使用bitman的任何代码。

跨边界赋值

如果可以在u16的中部赋值u8,那岂不是很好?我们也这样认为。不幸的是,这不是我们能在当前版本中添加到bitman中的功能。一旦我们的向量和数组支持完成,这还将使向量和数组中的多个项的赋值成为可能。

依赖关系

~205KB