How to swap all odd and even bits in Rust

1 Answer

0 votes
fn main() {
    let n: u32 = 90;
    
    println!("Input: {}", to_bit_string(n, 8));
    
    let result = swaps_odd_and_even_bits(n);
    
    println!("Result: {}", to_bit_string(result, 8));
}

/// Swaps odd and even bits in a 32-bit unsigned integer.
fn swaps_odd_and_even_bits(n: u32) -> u32 {
    // Mask to isolate odd bits: binary 101010... (hex: 0xAAAAAAAA)
    let odd_bits = n & 0xAAAAAAAA;

    // Mask to isolate even bits: binary 010101... (hex: 0x55555555)
    let even_bits = n & 0x55555555;

    println!("oddBits: {}", to_bit_string(odd_bits, 8));
    println!("evenBits: {}", to_bit_string(even_bits, 8));

    // Shift odd bits right to move them to even positions
    let shifted_odd_bits = odd_bits >> 1;

    // Shift even bits left to move them to odd positions
    let shifted_even_bits = even_bits << 1;

    println!("oddBits Right-shift: {}", to_bit_string(shifted_odd_bits, 8));
    println!("evenBits Left-shift: {}", to_bit_string(shifted_even_bits, 8));

    // Combine the shifted bits
    shifted_odd_bits | shifted_even_bits
}

/// Converts a number to a binary string with fixed width.
/// Pads with leading zeros to match the desired bit width.
fn to_bit_string(n: u32, width: usize) -> String {
    format!("{:0width$b}", n, width = width)
}



/*
run:

Input: 01011010
oddBits: 00001010
evenBits: 01010000
oddBits Right-shift: 00000101
evenBits Left-shift: 10100000
Result: 10100101

*/

 



answered Oct 26, 2025 by avibootz
edited Oct 26, 2025 by avibootz
...