Set right-adjacent bits: Difference between revisions

Content added Content deleted
(Promote to full task status)
(Add a Rust example)
Line 601: Line 601:
011111111111111011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110
011111111111111011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110</pre>
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110</pre>

=={{header|Rust}}==
<lang rust>use std::ops::{BitOrAssign, Shr};

fn set_right_adjacent_bits<E: Clone + BitOrAssign + Shr<usize, Output = E>>(b: &mut E, n: usize) {
for _ in 1..=n {
*b |= b.clone() >> 1;
}
}

macro_rules! test {
( $t:ident, $n:expr, $e:expr, $g:ty, $b:expr, $c:expr$(,)? ) => {
#[test]
fn $t() {
let n: usize = $n;
let e: usize = $e;
let b_original: $g = $b;
let mut b = b_original.clone();
set_right_adjacent_bits(&mut b, n);
println!("n = {n}; e = {e}:");
println!(" b = {:0>e$b}", b_original);
println!(" output = {:0>e$b}", b);
assert_eq!(b, $c);
}
};
}

test!(test_a1, 2, 4, u8, 0b1000, 0b1110);
test!(test_a2, 2, 4, u8, 0b0100, 0b0111);
test!(test_a3, 2, 4, u8, 0b0010, 0b0011);
test!(test_a4, 2, 4, u8, 0b0000, 0b0000);
test!(
test_b1, 0, 66, u128,
0b010000000000100000000010000000010000000100000010000010000100010010,
0b010000000000100000000010000000010000000100000010000010000100010010,
);
test!(
test_b2, 1, 66, u128,
0b010000000000100000000010000000010000000100000010000010000100010010,
0b011000000000110000000011000000011000000110000011000011000110011011,
);
test!(
test_b3, 2, 66, u128,
0b010000000000100000000010000000010000000100000010000010000100010010,
0b011100000000111000000011100000011100000111000011100011100111011111,
);
test!(
test_b4, 3, 66, u128,
0b010000000000100000000010000000010000000100000010000010000100010010,
0b011110000000111100000011110000011110000111100011110011110111111111,
);</lang>
{{out}}
<pre>
n = 2; e = 4:
b = 1000
output = 1110
n = 2; e = 4:
b = 0100
output = 0111
n = 2; e = 4:
b = 0010
output = 0011
n = 2; e = 4:
b = 0000
output = 0000
n = 0; e = 66:
b = 010000000000100000000010000000010000000100000010000010000100010010
output = 010000000000100000000010000000010000000100000010000010000100010010
n = 1; e = 66:
b = 010000000000100000000010000000010000000100000010000010000100010010
output = 011000000000110000000011000000011000000110000011000011000110011011
n = 2; e = 66:
b = 010000000000100000000010000000010000000100000010000010000100010010
output = 011100000000111000000011100000011100000111000011100011100111011111
n = 3; e = 66:
b = 010000000000100000000010000000010000000100000010000010000100010010
output = 011110000000111100000011110000011110000111100011110011110111111111
</pre>


=={{header|Wren}}==
=={{header|Wren}}==