如何在Rust中表示这种代码?
uint8_t pmport:4;
uint8_t rsv0:3;
uint8_t c:1;
我想将这3个值打包成一个u8
。如何在Rust中实现这一目标?
答案 0 :(得分:5)
Rust没有像C那样在语言中内置位字段。
但是,您可以使用bitfield之类的包来实现相同的功能。
bitfield
宏允许您为每个位字段定义类型,大小和访问器方法。
#[macro_use] extern crate bitfield;
bitfield! {
struct Example(u8);
u8;
get_pmport, set_pmport: 3, 0; // bits 0-3
get_rsv0, set_rsv0: 6, 4; // bits 4-6
get_c, set_c: 7, 7; // bit 7
}
fn main() {
println!("size of Example: {}", ::std::mem::size_of::<Example>());
let mut e = Example(0);
println!("pmport: {}, rsv0: {}, c: {}", e.get_pmport(), e.get_rsv0(), e.get_c());
e.set_pmport(5);
println!("pmport: {}, rsv0: {}, c: {}", e.get_pmport(), e.get_rsv0(), e.get_c());
e.set_rsv0(3);
println!("pmport: {}, rsv0: {}, c: {}", e.get_pmport(), e.get_rsv0(), e.get_c());
e.set_c(1);
println!("pmport: {}, rsv0: {}, c: {}", e.get_pmport(), e.get_rsv0(), e.get_c());
e.set_rsv0(0);
println!("pmport: {}, rsv0: {}, c: {}", e.get_pmport(), e.get_rsv0(), e.get_c());
}