5个不稳定版本
0.3.1 | 2022年5月3日 |
---|---|
0.3.0 | 2022年5月3日 |
0.2.1 | 2022年4月23日 |
0.2.0 | 2022年4月21日 |
0.1.0 | 2022年4月21日 |
#12 in #位掩码
9MB
3K SLoC
包含 (ELF库, 8.5MB) libpaste-20ebc6fd9e2b3438.so,(ELF可执行文件/库, 4.5MB) build-script-build,(ELF可执行文件/库, 4.5MB) build_script_build-ab83651059ca7977,(WOFF字体, 680KB) docs/doc/NanumBarunGothic.ttf.woff,(WOFF字体, 400KB) docs/doc/NanumBarunGothic.ttf.woff2,(WOFF字体, 190KB) docs/doc/FiraSans-Medium.woff 和更多。
ubits
Rust的位字段和掩码!
提供用于生成带有标志和某些有用特实现的全套 位字段
类型的宏。
支持 8
、16
、32
、64
和 128
位的字段宽度。
注意:示例模块仅用于文档构建,不可在野外导入。
用法
生成一个带有标志枚举的位字段结构体...(以下示例都使用此定义。)
use ubits::bitfield;
bitfield! {
pub u8 ExampleField
ExampleFlags {
0 : Flag0,
1 : Flag1,
2 : Flag2,
3 : Flag3,
4 : Flag4,
5 : Flag5,
6 : Flag6,
7 : Flag7,
}
}
实例
从整数
let from_integer = ExampleField(123);
assert_eq!(ExampleField(123), from_integer);
从二进制字符串
let from_binary = ExampleField::from_binary_str("01111011");
assert_eq!(ExampleField(123), from_binary)
从单1
let from_ones = ExampleField::ones();
assert_eq!("11111111", from_ones.as_binary());
assert_eq!(255, from_ones.as_integer());
从单0
let from_zeros = ExampleField::zeros();
assert_eq!("00000000", from_zeros.as_binary());
assert_eq!(0, from_zeros.as_integer());
字段访问
通过字段获取位值
let field = ExampleField::from_binary_str("01010101");
assert!(field.get(ExampleFlags::Flag0));
assert!(!field.get(ExampleFlags::Flag1));
通过索引获取位值
let field = ExampleField::from_binary_str("01010101");
assert!(field.get_index(0));
assert!(!field.get_index(1));
通过字段设置位值
let mut field = ExampleField::from_binary_str("01010101");
field.set(ExampleFlags::Flag1);
field.set(ExampleFlags::Flag3);
assert_eq!("01011111", field.as_binary());
通过索引设置位值
let mut field = ExampleField::from_binary_str("01010101");
field.set_index(1);
field.set_index(3);
assert_eq!("01011111", field.as_binary());
通过字段清除位值
let mut field = ExampleField::from_binary_str("01010101");
field.clear(ExampleFlags::Flag0);
field.clear(ExampleFlags::Flag2);
assert_eq!("01010000", field.as_binary());
通过索引清除位值
let mut field = ExampleField::from_binary_str("01010101");
field.clear_index(0);
field.clear_index(2);
assert_eq!("01010000", field.as_binary());
通过字段切换位值
let mut field = ExampleField::from_binary_str("01010101");
field.toggle(ExampleFlags::Flag0);
assert_eq!("01010100", field.as_binary());
field.toggle(ExampleFlags::Flag0);
assert_eq!("01010101", field.as_binary());
通过索引切换位值
let mut field = ExampleField::from_binary_str("01010101");
field.toggle_index(0);
assert_eq!("01010100", field.as_binary());
field.toggle_index(0);
assert_eq!("01010101", field.as_binary());
命名获取器和设置器
ubits可以生成零个或多个字段的获取器和设置器方法,如果提供名称。
use ubits::bitfield;
bitfield! {
pub u8 ExampleField
ExampleFlags {
0 : Flag0 : (field_0), // is_field_0 & set_field_0 & clear_field_0 & toggle_field_0
1 : Flag1 : (field_1), // is_field_1 & set_field_1 & clear_field_1 & toggle_field_1
2 : Flag2,
3 : Flag3,
4 : Flag4,
5 : Flag5,
6 : Flag6,
7 : Flag7,
}
}
let mut field = ExampleField::from_binary_str("01010101");
assert_eq!(true, field.is_field_0());
assert_eq!(false, field.is_field_1());
field.set_field_1();
assert_eq!(true, field.is_field_1());
field.clear_field_1();
assert_eq!(false, field.is_field_1());
field.toggle_field_1();
assert_eq!(true, field.is_field_1());
组合
组合位字段
(使用 into_combined
来消费自身)
let mut a = ExampleField::from_binary_str("01010101");
let b = ExampleField::from_binary_str("10101010");
assert_eq!("11111111", a.combine(b).as_binary());
获取两个位字段的交集
(使用 into_intersection
来消费自身)
let mut a = ExampleField::from_binary_str("11000011");
let b = ExampleField::from_binary_str("01111110");
assert_eq!("01000010", a.intersect(b).as_binary());
获取两个位字段之间的差异
(使用 into_diff
来消费自身)
let mut a = ExampleField::from_binary_str("11000011");
let b = ExampleField::from_binary_str("01100110");
assert_eq!("10100101", a.diff(b).as_binary());
位运算
位字段实例和标志都使用位运算符来更改位值。
let mut from_zeros = ExampleField::zeros();
assert_eq!("00000000", from_zeros.as_binary());
// set bit to 1
from_zeros |= ExampleFlags::Flag1;
assert_eq!("00000010", from_zeros.as_binary());
// set bit back to 0
from_zeros &= ExampleFlags::Flag1;
assert_eq!("00000000", from_zeros.as_binary());
// toggle a bit
from_zeros ^= ExampleFlags::Flag1;
assert_eq!("00000010", from_zeros.as_binary());
from_zeros ^= ExampleFlags::Flag1;
assert_eq!("00000000", from_zeros.as_binary());
操作也可以链接在一起
let mut from_zeros = ExampleField::zeros() | ExampleFlags::Flag1 | ExampleFlags::Flag3;
assert_eq!("00001010", from_zeros.as_binary());
可以从组合标志创建位字段实例
let mut from_zeros = ExampleFlags::Flag1 | ExampleFlags::Flag3;
assert_eq!("00001010", from_zeros.as_binary());
使用标志命名的字段
生成的标志枚举允许您通过名称访问位。标志有一个关联的 [u8
] 值,它决定了目标位的索引。(有关更多信息,请参阅 bitfield
)
以下输入...
1 0 1 0 0 1 1 0
以下标志...
0 : f1
1 : f1
2 : f2
3 : f3
4 : f4
5 : f5
6 : f6
7 : f7
我们得到了这个布局。
名称 | f7 | f6 | f5 | f4 | f3 | f2 | f1 | f0 |
---|---|---|---|---|---|---|---|---|
位值 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 |
索引 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
使用相同的输入,但只有前几个标志
0 : f0
1 : f1
2 : f2
我们得到了这个布局。
名称 | f2 | f1 | f0 | |||||
---|---|---|---|---|---|---|---|---|
位值 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 |
索引 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
使用相同的输入,但标志分散
1 : f0
3 : f1
6 : f2
我们得到了这个布局。
名称 | f2 | f1 | f0 | |||||
---|---|---|---|---|---|---|---|---|
位值 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 |
索引 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |