首页 > 解决方案 > 如何修改Rust中给定位置的位值?

问题描述

我可以用 1 替换该值,但不能用 0 替换。下面程序的输出是0b11111111. 理想情况下应该是0b11110000。请让我知道我在这里缺少什么。

use std::mem;

fn main() {
    let a: u8 = 0b00001111;
    let b: u8 = 0b11111111;
    let c: u8 = 0b00000000;
    let length = mem::size_of_val(&a) * 8;
    let mut p : u8 = b;

    for n in 0..length {


        if (a >> n & 1) == 0b1 {
            let d = c >> n & 1;
            p = p | (d << n);
        }

    }

    println!("0b{:08b}", p);

}

标签: rust

解决方案


这不是特定于生锈的。

True | x => True
True & x => x
True ^ x =? ¬x
False | x => x
False & x => False
False ^ x => x

所以对于你的价值观

a | b == 0b11111111
a ^ b == 0b11110000
a & b == 0b00001111

就您的代码而言,在a >> n & 1 == 0. 你需要使用类似的东西

let d = b ^ (1<<n); // switch nth bit - gives something like 0b11101111
p = p & d; // leaves all bits untouched except nth which is set to 0

推荐阅读