1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
use std::mem;

/// Find last set bit
/// fls(0) == 0, fls(u32::MAX) == 32
pub fn fls<T: num_traits::PrimInt>(v: T) -> usize {
    mem::size_of::<T>() * 8 - v.leading_zeros() as usize
}

pub fn ilog2<T: num_traits::PrimInt>(v: T) -> usize {
    fls(v) - 1
}