fantasy_util/bit/
usize.rs1pub trait BitUtil<T> {
3 fn extract(self, off: u8, len: u8) -> T;
13
14 fn get_bit_bool(self, bit: u8) -> bool;
24
25 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}