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

Dra*_*ght 1 rust

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

uint8_t  pmport:4;  
uint8_t  rsv0:3;        
uint8_t  c:1;       
Run Code Online (Sandbox Code Playgroud)

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

Fer*_*cio 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());
}
Run Code Online (Sandbox Code Playgroud)