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}}== |