1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
use bitops::*; use ffs::*; use fls::*; pub fn rounddown_pow2<T: Bitops>(x: T) -> T { let msb_index = msb(x); let one = T::one(); let bitlen = bit_length::<T>(); assert!(msb_index < bitlen as i8); assert!(msb_index >= 0); one << (msb_index as usize) } pub fn roundup_pow2<T: Bitops>(x: T) -> T { let mut msb_index = msb(x); let lsb_index = lsb(x); let one = T::one(); let bitlen = bit_length::<T>(); assert!(msb_index >= 0 && lsb_index >= 0); if msb_index != lsb_index { msb_index += 1; } assert!(msb_index < bitlen as i8); assert!(msb_index >= 0); one << (msb_index as usize) }