Skip to main content

stackforge_core/utils/
bits.rs

1//! Bitwise operations and byte order conversions.
2
3/// Extract bits from a byte.
4#[inline]
5pub fn extract_bits(byte: u8, start: u8, len: u8) -> u8 {
6    (byte >> (8 - start - len)) & ((1 << len) - 1)
7}
8
9/// Set bits in a byte.
10#[inline]
11pub fn set_bits(byte: &mut u8, start: u8, len: u8, value: u8) {
12    let mask = ((1u8 << len) - 1) << (8 - start - len);
13    *byte = (*byte & !mask) | ((value << (8 - start - len)) & mask);
14}
15
16/// Convert a u16 to big-endian bytes.
17#[inline]
18pub const fn u16_to_be(value: u16) -> [u8; 2] {
19    value.to_be_bytes()
20}
21
22/// Convert a u32 to big-endian bytes.
23#[inline]
24pub const fn u32_to_be(value: u32) -> [u8; 4] {
25    value.to_be_bytes()
26}
27
28/// Convert big-endian bytes to u16.
29#[inline]
30pub const fn be_to_u16(bytes: [u8; 2]) -> u16 {
31    u16::from_be_bytes(bytes)
32}
33
34/// Convert big-endian bytes to u32.
35#[inline]
36pub const fn be_to_u32(bytes: [u8; 4]) -> u32 {
37    u32::from_be_bytes(bytes)
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn test_extract_bits() {
46        let byte = 0b1010_0110;
47        assert_eq!(extract_bits(byte, 0, 4), 0b1010);
48        assert_eq!(extract_bits(byte, 4, 4), 0b0110);
49        assert_eq!(extract_bits(byte, 2, 4), 0b1001);
50    }
51
52    #[test]
53    fn test_set_bits() {
54        let mut byte = 0b0000_0000;
55        set_bits(&mut byte, 0, 4, 0b1010);
56        assert_eq!(byte, 0b1010_0000);
57
58        set_bits(&mut byte, 4, 4, 0b0110);
59        assert_eq!(byte, 0b1010_0110);
60    }
61}