/*
Removes the bit at the given position and shifts all higher bits right.
*/
fn remove_bit_and_shift(number: i32, position: i32) -> i32 {
/*
number = 22 (10110)
position = 2 (0 = LSB)
Bits: 1 0 1 1 0
^ remove this bit
left = bits above removed bit
right = bits below removed bit
result = (left << position) | right
*/
let left = number >> (position + 1); // bits above removed bit
let right = number & ((1 << position) - 1); // bits below removed bit
(left << position) | right // merge shifted left + right
}
/*
Prints a 32-bit binary representation of an integer.
*/
fn print_binary(value: i32) {
/*
Uses:
format!("{:b}", value) → binary string
pad to 32 bits
group into 4-bit chunks for readability
*/
let mut binary = format!("{:b}", value);
if binary.len() < 32 {
binary = "0".repeat(32 - binary.len()) + &binary;
}
// Group into 4-bit chunks
for chunk in binary.as_bytes().chunks(4) {
print!("{} ", std::str::from_utf8(chunk).unwrap());
}
println!();
}
fn main() {
let number: i32 = 22;
let position: i32 = 2; // remove bit 2 (0 = LSB)
println!("Original number in binary:");
print_binary(number);
let result = remove_bit_and_shift(number, position);
println!();
println!(
"Number after removing bit {} and shifting remaining bits:",
position
);
print_binary(result);
println!();
println!("Result as integer: {}", result);
}
/*
run:
Original number in binary:
0000 0000 0000 0000 0000 0000 0001 0110
Number after removing bit 2 and shifting remaining bits:
0000 0000 0000 0000 0000 0000 0000 1010
Result as integer: 10
*/