【问题标题】:How do you set, clear and toggle a single bit in Rust?如何在 Rust 中设置、清除和切换单个位?
【发布时间】:2016-11-07 14:48:24
【问题描述】:

如何在 Rust 中设置、清除和切换位?

【问题讨论】:

  • 你在寻找如何旋转比特吗?
  • Rust 有位运算符吗?
  • 你没有试过&|^吗?它们都在 Rust 中可用。
  • @LưuVĩnhPhúc:有。
  • 那为什么不直接使用另一个问题的内容呢?

标签: rust bit-manipulation


【解决方案1】:

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

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);
}

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

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

【讨论】:

  • !~ 的有趣之处。我可能会先尝试后者。
  • @XavierT。是的,这绝对是不同的,但 IMO 最终确实更有意义。毕竟,这只是一个否定。
  • fyi,符号"{:#08b}" 旨在在二进制数之前打印'0b'(或'0x'等)
  • @Djzin TIL!但是,零填充感觉不“正确”;你实际上必须使用{:#010b},因为它是一个整体宽度:-(
【解决方案2】:

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);
}

它还具有复合赋值变体(|=&amp;=^=)。

The book has some more information

【讨论】:

    猜你喜欢
    • 2023-02-14
    • 2010-11-29
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多