How to zero every n-bit from a number if that bit is 1 in Rust

1 Answer

0 votes
/*
    zero_bits_every_step(number, step)
    ----------------------------------
    Zeros every `step`-th bit (0-based from LSB)
    but only if that bit is currently 1.

    Example:
        number = 536870911
        step = 3  → zero bits 0, 3, 6, 9, ...
*/
fn zero_bits_every_step(number: u32, step: usize) -> u32 {
    let mut result = number;

    let mut pos = 0usize;
    while pos < 32 {
        let mask = 1u32 << pos;

        // If the bit is 1, zero it
        if result & mask != 0 {
            result &= !mask;
        }

        pos += step;
    }

    result
}

/*
    print_binary(n)
    ---------------
    Prints a 32-bit binary representation of an integer.
*/
fn print_binary(n: u32) {
    let s = format!("{:032b}", n);

    for (i, ch) in s.chars().enumerate() {
        print!("{}", ch);
        if (i + 1) % 4 == 0 {
            print!(" ");
        }
    }
    println!();
}

fn main() {
    let number: u32 = 536_870_911; // 0001 1111 1111 1111 1111 1111 1111 1111
    let step: usize = 3;           // zero bits 0, 3, 6, 9, ...

    println!("Original number in binary:");
    print_binary(number);

    let result = zero_bits_every_step(number, step);

    println!("\nNumber after zeroing every {} bits (only if bit was 1):", step);
    print_binary(result);

    println!("\nResult as integer: {}", result);
}



/*
run:

Original number in binary:
0001 1111 1111 1111 1111 1111 1111 1111 

Number after zeroing every 3 bits (only if bit was 1):
0001 0110 1101 1011 0110 1101 1011 0110 

Result as integer: 383479222

*/

 



answered 12 hours ago by avibootz
...