Rust与C中的冒号运算符有什么相似之处?

时间:2018-01-19 20:34:05

标签: rust

如何在Rust中表示这种代码?

uint8_t  pmport:4;  
uint8_t  rsv0:3;        
uint8_t  c:1;       

我想将这3个值打包成一个u8。如何在Rust中实现这一目标?

1 个答案:

答案 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());
}