1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use crate::{Limb, LimbUInt, UInt};
impl<const LIMBS: usize> UInt<LIMBS> {
#[allow(trivial_numeric_casts)]
pub const fn bits(self) -> usize {
let mut i = LIMBS - 1;
while i > 0 && self.limbs[i].0 == 0 {
i -= 1;
}
let limb = self.limbs[i].0;
let bits = (Limb::BIT_SIZE * (i + 1)) as LimbUInt - limb.leading_zeros() as LimbUInt;
Limb::ct_select(
Limb(bits),
Limb::ZERO,
!self.limbs[0].is_nonzero() & !Limb(i as LimbUInt).is_nonzero(),
)
.0 as usize
}
}