2个稳定版本

1.1.0 2019年1月4日
1.0.0 2018年12月23日
0.0.0 2017年6月30日

#2044 in Rust模式

MIT 许可证

27KB
500

quark

位级操作数字原始类型的类型。

Build Status Coverage Status Docs.rs

quark 包提供了访问数字原始类型部分的特质,并为使用不在标准库中包含的位计数来表示数字添加了新的类型。

位索引

使用移位和掩码访问数字原始类型中的位或位范围可能很麻烦,可读性也不强

let big: u16 = 0x35;
let small = big >> 2 & 0x1f;
assert_eq!(small, 0xd);

乍一看,很难解析如下内容:

  • 有多少位对结果值有贡献,哪些位肯定是零?
  • 原始值中的哪些位在结果中?

使用BitIndex特质,上面的示例可以写成:

use quark::BitIndex;

let big: u16 = 0x35;
let small = big.bits(2..7);
assert_eq!(small, 0xd);

位掩码

BitMask特质允许使用长度和掩码来轻松生成位掩码

use quark::BitMask;

let mask = u32::mask(8);
assert_eq!(mask, 0xff);

let value: u32 = 0x1234_5678;
assert_eq!(value.mask_to(16), 0x5678);

位大小

在实现数字类型的特质时,有时可能需要知道类型的大小。一种解决方案是为特质添加一个bit_size()bit_length()方法,以便为每种类型返回一个常量。BitSize特质为数字类型添加了一个BIT_SIZE常量,可以在实现特质时使用,而无需另一个方法。

符号扩展

Signs特质增加了在无符号原始类型(以及有符号类型)上检查符号位的方法,以及将值扩展为任意数量的位

use quark::Signs;

let unsigned = 0x00ff_ffffu32;
let signed = unsigned.sign_extend(8);
assert_eq!(signed, 0xffff_ffff);

为什么是quark

因为我们的程序是最低级别的原始,如i32u8usize这样的类型就像是原子数据。quark包将下一级向下走,而quarks相对于原子处于下一级。

此外,我对以'Q'开头的名字有偏好,因为我的姓氏以一个'Q'开头。

无运行时依赖