fantasy_util/bit/
usize.rs

1/// 对于usize值的扩展方法
2pub trait BitUtil<T> {
3    /// 获取指定长度的位,其他位置0
4    ///
5    /// #Example
6    /// ```
7    /// use fantasy_util::bit::usize::BitUtil;
8    ///
9    /// let a:u32 = 0b1001_1001 as u32;
10    /// let i:u32 = a.extract(3,4); // i = 0b0000_0011;
11    /// ```
12    fn extract(self, off: u8, len: u8) -> T;
13
14    /// 获取指定位的bool值
15    ///
16    /// #Example
17    /// ```
18    /// use fantasy_util::bit::usize::BitUtil;
19    ///
20    /// let a:u32 = 0b1001_1001 as u32;
21    /// let b:bool = a.get_bit_bool(0); // b=true;
22    /// ```
23    fn get_bit_bool(self, bit: u8) -> bool;
24
25    /// 获取指定位
26    /// #Example
27    /// ```
28    /// use fantasy_util::bit::usize::BitUtil;
29    ///
30    /// let a:u32 = 0b1001_1001 as u32;
31    /// let b:bool = a.get_bit_bool(0); // b = true;
32    /// ```
33    fn get_bit(self, bit: u8) -> u8;
34}
35
36impl BitUtil<u8> for u8 {
37    #[inline(always)]
38    fn extract(self, off: u8, len: u8) -> u8 { (self >> off) & ((1u8 << len) - 1) }
39
40    #[inline(always)]
41    fn get_bit_bool(self, bit: u8) -> bool { self.get_bit(bit) != 0 }
42
43    #[inline(always)]
44    fn get_bit(self, bit: u8) -> u8 { ((self >> bit) as u8) & 1 }
45}
46
47impl BitUtil<u16> for u16 {
48    #[inline(always)]
49    fn extract(self, off: u8, len: u8) -> u16 { (self >> off) & ((1u16 << len) - 1) }
50
51    #[inline(always)]
52    fn get_bit_bool(self, bit: u8) -> bool { self.get_bit(bit) != 0 }
53
54    #[inline(always)]
55    fn get_bit(self, bit: u8) -> u8 { ((self >> bit) as u8) & 1 }
56}
57
58
59impl BitUtil<u32> for u32 {
60    #[inline(always)]
61    fn extract(self, off: u8, len: u8) -> u32 { (self >> off) & ((1u32 << len) - 1) }
62
63    #[inline(always)]
64    fn get_bit_bool(self, bit: u8) -> bool { self.get_bit(bit) != 0 }
65
66    #[inline(always)]
67    fn get_bit(self, bit: u8) -> u8 { ((self >> bit) as u8) & 1 }
68}
69
70impl BitUtil<u64> for u64 {
71    #[inline(always)]
72    fn extract(self, off: u8, len: u8) -> u64 { (self >> off) & ((1u64 << len) - 1) }
73
74    #[inline(always)]
75    fn get_bit_bool(self, bit: u8) -> bool { self.get_bit(bit) != 0 }
76
77    #[inline(always)]
78    fn get_bit(self, bit: u8) -> u8 { ((self >> bit) as u8) & 1 }
79}
80
81
82impl BitUtil<u128> for u128 {
83    #[inline(always)]
84    fn extract(self, off: u8, len: u8) -> u128 { (self >> off) & ((1u128 << len) - 1) }
85
86    #[inline(always)]
87    fn get_bit_bool(self, bit: u8) -> bool { self.get_bit(bit) != 0 }
88
89    #[inline(always)]
90    fn get_bit(self, bit: u8) -> u8 { ((self >> bit) as u8) & 1 }
91}
92
93
94#[cfg(test)]
95mod tests {
96    use crate::bit::usize::BitUtil;
97
98    #[test]
99    fn it_works() {
100        let a: u32 = 0b1001_1001;
101        let i = a.extract(3, 4);
102        assert_eq!(0b0011, i);
103    }
104}