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
*/