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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use word::Word;
use bitintr;

/// Count the number of trailing zeros in the binary representation of `x`.
///
/// # Keywords:
///
/// Count trailing zeros.
///
/// # Intrinsics:
/// - BMI 1.0: tzcnt.
/// - gcc/llvm builtin: `x == 0 ? mem::size_of(x) * 8 : __builtin_ctz(x)`.
///
/// # Examples
///
/// ```
/// use bitwise::word::*;
///
/// let n = 0b0010_1000u16;
///
/// assert_eq!(n.count_trailing_zeros(), 3);
/// assert_eq!(count_trailing_zeros(n), 3);
/// ```
#[inline]
pub fn count_trailing_zeros<T: Word>(x: T) -> T {
    bitintr::x86::bmi::tzcnt(x)
}

/// Method version of [`count_trailing_zeros`](fn.count_trailing_zeros.html).

pub trait CountTrailingZeros {
    #[inline]
    fn count_trailing_zeros(self) -> Self;
}

impl<T: Word> CountTrailingZeros for T {
    #[inline]
    fn count_trailing_zeros(self) -> Self {
        count_trailing_zeros(self)
    }
}