2个稳定版本
1.1.0 | 2019年1月4日 |
---|---|
1.0.0 | 2018年12月23日 |
0.0.0 |
|
#2044 in Rust模式
27KB
500 行
quark
位级操作数字原始类型的类型。
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
?
因为我们的程序是最低级别的原始,如i32
、u8
和usize
这样的类型就像是原子数据。quark
包将下一级向下走,而quarks相对于原子处于下一级。
此外,我对以'Q'开头的名字有偏好,因为我的姓氏以一个'Q'开头。