How do you set, clear and toggle a single bit in Rust?

后端 未结 2 560
不思量自难忘°
不思量自难忘° 2020-11-29 08:33

How do I set, clear and toggle a bit in Rust?

相关标签:
2条回答
  • 2020-11-29 09:02

    Rust has both bit-twiddling operators and binary format printing (very helpful for debugging):

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

    It also has the compound assignment variants (|=, &= and ^=).

    The book has some more information

    0 讨论(0)
  • 2020-11-29 09:08

    Like many other languages, the bitwise operators & (bitwise AND), | (bitwise OR), ^ (bitwise XOR) exist:

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

    The main difference from other languages is in bitwise NOT, which uses ! instead of ~:

    fn main() {
        let mut byte: u8 = 0b0000_0000;
    
        byte = !byte; // Flip all bits
        println!("0b{:08b}", byte);
    }
    

    You can also shift bits left or right:

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

    There are many other conceptual things that ultimately do bit-level manipulation that are not expressed with operators. Check out the documentation for an integer for examples. One interesting example is leading_zeros. Here is how to rotate by a certain number of bits:

    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

    0 讨论(0)
提交回复
热议问题