use sp_core::U256;
pub trait Bits {
#[must_use]
fn arithmetic_shr(self, rhs: usize) -> Self;
}
impl Bits for U256 {
fn arithmetic_shr(self, rhs: usize) -> Self {
const BITS: usize = 256;
let sign = self.bit(BITS - 1);
let mut r = self >> rhs;
if sign {
r |= U256::MAX << BITS.saturating_sub(rhs);
}
r
}
}
#[cfg(test)]
mod tests {
use super::*;
use proptest::proptest;
#[test]
fn test_arithmetic_shr() {
proptest!(|(limbs: [u64; 4], shift in 0usize..=258)| {
let ours = U256(limbs).arithmetic_shr(shift);
let theirs = alloy_core::primitives::U256::from_limbs(limbs).arithmetic_shr(shift);
assert_eq!(&ours.0, theirs.as_limbs());
});
}
}