【问题标题】:How do you approach creating a complete new datatype on the "bit-level"?您如何在“位级”上创建一个完整的新数据类型?
【发布时间】:2020-04-24 11:10:17
【问题描述】:

我想在 Rust 中创建一个“位级”的新数据类型。

例如,四精度浮点数。我可以创建一个具有两个双精度浮点数的结构,并通过将四边形分成两个双精度来任意提高精度,但我不想这样做(这就是我在“位级”上的意思)。

我考虑过使用u8-array 或bool-array,但在这两种情况下,我都浪费了 7 位内存(因为 bool 也是一个字节大)。我知道有几个crates 实现了位数组或位向量之类的东西,但是查看它们的源代码并不能帮助我理解它们的实现。

如何在不浪费内存的情况下创建这样的位数组,这是我在实现四精度类型时想要选择的方式吗?

我不知道如何实现不使用基本类型的新数据类型或者是结合基本类型的结构,我还没有在网上找到解决方案;也许我没有使用正确的关键字进行搜索。

【问题讨论】:

  • “在这两种情况下,我都浪费了 7 位内存”是什么意思?使用每个 u8 的每一位,你就不会。
  • 您好,欢迎来到 StackOverflow!所以要明确一点,与 Python 交互的部分只是背景故事,问题根本与 Python 无关?您要创建的新的四精度浮点类型不必从 Python 访问,是吗?
  • This Q&A 可能对您有帮助吗? u8 数组不会浪费任何位,但您似乎不确定如何“访问”这些位?
  • @LukasKalbertodt 是的,Python 只是背景故事,不需要访问它。是的,你是对的,更具体地说,如果我只在 u8 中写 1 和 0 会浪费位
  • 要清楚,您的字节数组将是[u8; 16],而不是[u8; 128]。正如 Ry- 所说;您使用 所有 个位。

标签: struct rust bitarray


【解决方案1】:

您所问的问题没有直接答案:就像任何其他编程语言一样,Rust 有一套基本的类型布局规则。这是因为(大多数)现实世界的 CPU 无法寻址单个位,在引用内存时需要某些对齐,有关于指针算法如何工作的规则等等。

例如,如果您创建一个只有两位的类型,您仍然需要一个 8 位字节来表示该类型,因为在大多数 CPU 的操作码上根本无法寻址两个单独的位;也没有办法获取这种类型的地址,因为寻址至少在字节级别上起作用。有关这方面的更多有用信息,请参阅here,第 2 节,The Anatomy of a Type。请注意,您正在考虑的非浪费位级别类型需要满足其中提到的所有规则。

这是一种非常合理的方法来表示您想要做的事情,例如或者作为单个包装的u128 并在该类型之上实现所有算术。另一种更通用的方法是使用Vec<u8>。你总是会做相对大量的位掩码、间接等操作。

看看rust_decimal 或类似的板条箱也可能是个好主意。

【讨论】:

  • 因此,如果我在 u128 上实现四边形,例如乘法相对较慢,因为在这种情况下,我不能只应用标准浮点运算,因为它直接与单个位的 ?
  • @MEisebitt 好吧,“标准浮点运算”通常由 CPU 中的物理硬件实现,所以除非你有 128 位 FPU(并且可以说服 LLVM 使用它),是的要慢很多。仅靠软件无法获得类似硬件的速度。
猜你喜欢
  • 2011-02-26
  • 2013-03-05
  • 2019-08-18
  • 2011-12-16
  • 1970-01-01
  • 2021-03-22
  • 2020-02-23
  • 1970-01-01
  • 2015-01-03
相关资源
最近更新 更多