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