2022-06-11 11:46:10 +02:00
|
|
|
#ifndef BITS_H
|
|
|
|
#define BITS_H
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Utility functions to operate on bits.
|
|
|
|
*/
|
|
|
|
|
2022-08-31 12:16:36 +02:00
|
|
|
#include <assert.h>
|
2022-06-11 11:46:10 +02:00
|
|
|
#include <stdbool.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check whether a byte has a bit set.
|
|
|
|
*/
|
|
|
|
static inline bool
|
|
|
|
has_bit(uint8_t val, size_t index)
|
|
|
|
{
|
|
|
|
return val & (1 << index);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Extract a bit range from a byte.
|
|
|
|
*
|
|
|
|
* Both offsets are inclusive, start from zero, and high must be greater than low.
|
|
|
|
*/
|
|
|
|
static inline uint8_t
|
|
|
|
get_bit_range(uint8_t val, size_t high, size_t low)
|
|
|
|
{
|
|
|
|
size_t n;
|
|
|
|
uint8_t bitmask;
|
|
|
|
|
|
|
|
assert(high <= 7 && high >= low);
|
|
|
|
|
|
|
|
n = high - low + 1;
|
|
|
|
bitmask = (uint8_t) ((1 << n) - 1);
|
|
|
|
return (uint8_t) (val >> low) & bitmask;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|