Rust 相当于 C++ 与匿名结构的联合

Phi*_*hil 3 rust

是否有与以下 C++ 示例(我为这个问题编写的)等效的 Rust:

union example {
    uint32_t fullValue;

    struct {
        unsigned sixteen1: 16;
        unsigned sixteen2: 16;
    };


    struct {
        unsigned three: 3;
        unsigned twentynine: 29;
    };

};

example e;
e.fullValue = 12345678;

std::cout << e.sixteen1 << ' ' << e.sixteen2 << ' ' << e.three << ' ' << e.twentynine;
Run Code Online (Sandbox Code Playgroud)

作为参考,我正在编写一个 CPU 模拟器,并且能够轻松地拆分出这样的变量的二进制部分并通过不同的名称引用它们,使代码更加简单。我知道如何在 C++ 中执行此操作(如上所述),但正在努力找出如何在 Rust 中执行等效操作。

api*_*lat 6

您可以通过创建一个新类型结构并使用掩码和/或移位提取相关位来做到这一点。执行此操作的代码稍长(但也不是太长),重要的是避免了在 C++ 中触发的未定义行为。

#[derive(Debug, Clone, Copy)]
struct Example(pub u32);

impl Example {
    pub fn sixteen1(self) -> u32 {
        self.0 & 0xffff
    }
    pub fn sixteen2(self) -> u32 {
        self.0 >> 16
    }
    pub fn three(self) -> u32 {
        self.0 & 7
    }
    pub fn twentynine(self) -> u32 {
        self.0 >> 3
    }
}

pub fn main() {
    let e = Example(12345678);
    println!("{} {} {} {}", e.sixteen1(), e.sixteen2(), e.three(), e.twentynine());
}
Run Code Online (Sandbox Code Playgroud)