She*_*ter 24

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

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

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

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

    byte = !byte; // Flip all bits
    println!("0b{:08b}", byte);
}
Run Code Online (Sandbox Code Playgroud)

你也可以向左或向右移位:

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

还有许多其他概念性事物最终会进行比特级操作,而不是用运算符表达.有关示例,请查看整数文档.一个有趣的例子是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);
}
Run Code Online (Sandbox Code Playgroud)

这本书有更多的信息

  • @XavierT。是的,这绝对是不同的,但 IMO 最终确实更有意义。毕竟,这只是一个否定。 (2认同)

Mat*_* M. 10

Rust 既有 bit-twiddling 操作符,也有二进制格式打印(对调试非常有帮助):

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

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

这本书有更多信息