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

crates.io Downloads Build Docs Licence

Rust的位字段和掩码!

提供用于生成带有标志和某些有用特实现的全套 位字段 类型的宏。

支持 8163264128 位的字段宽度。

注意:示例模块仅用于文档构建,不可在野外导入。

用法

生成一个带有标志枚举的位字段结构体...(以下示例都使用此定义。)

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

依赖关系