你如何设置,清除和切换一个单一的位在生 rust ?

huus2vyu  于 2023-01-09  发布在  其他
关注(0)|答案(3)|浏览(94)

我如何设置,清除和切换一点生 rust ?

yeotifhr

yeotifhr1#

与许多其他语言一样,存在位运算符&(位与)、|(位或)、^(位异或):

fn main() {
    let mut byte: u8 = 0b0000_0000;

    byte |= 0b0000_1000; // Set a bit
    println!("0b{:08b}", byte);

    byte &= 0b1111_0111; // Unset a bit
    println!("0b{:08b}", byte);

    byte ^= 0b0000_1000; // Toggle a bit
    println!("0b{:08b}", byte);
}

与其他语言的主要区别在于按位NOT,它使用!而不是~

fn main() {
    let mut byte: u8 = 0b0000_0000;

    byte = !byte; // Flip all bits
    println!("0b{:08b}", byte);
}

您还可以将位左移或右移:

fn main() {
    let mut byte: u8 = 0b0000_1000;

    byte <<= 1; // shift left one bit
    println!("0b{:08b}", byte);

    byte >>= 1; // shift right one bit
    println!("0b{:08b}", byte);
}

还有许多其他概念性的东西最终会执行位级操作,但这些操作并没有用运算符来表示。请查看documentation for an integer的例子。一个有趣的例子是leading_zeros。下面是如何循环一定数量的位:

fn main() {
    let mut byte: u8 = 0b1000_0000;

    byte = byte.rotate_left(1); // rotate left one bit
    println!("0b{:08b}", byte);

    byte = byte.rotate_right(1); // rotate right one bit
    println!("0b{:08b}", byte);
}

The book has some more information

1szpjjfi

1szpjjfi2#

Rust有位操作符和二进制格式打印(对调试非常有帮助):

fn bit_twiddling(original: u8, bit: u8) {
    let mask = 1 << bit;

    println!(
        "Original: {:b}, Set: {:b}, Cleared: {:b}, Toggled: {:b}",
        original,
        original |  mask,
        original & !mask,
        original ^  mask
    );
}

fn main() {
    bit_twiddling(0, 3);
    bit_twiddling(8, 3);
}

它还具有化合物归属变体(|=&=^=)。
The book has some more information

guz6ccqo

guz6ccqo3#

此外,我想添加以下使用情形:如果你有一个像0b10001000这样的位域,并且你想在任何情况下都将第3位更新为true或false,你可以这样做:

const SHIFT: u8 = 3;
    let set_bit_3 = false;
    let bits = 0b10001000;
    let bits = bits & !(1 << SHIFT) | (u16::from(set_bit_3) << SHIFT);

相关问题