From 4823c4f3a4d48e5979b8e1349c62b47bd6d96c65 Mon Sep 17 00:00:00 2001 From: Eric-Paul Ickhorn Date: Wed, 6 Dec 2023 18:15:32 +0100 Subject: [PATCH] Added bitfield functions (not tested) --- core/exports/librr/bitfield.h | 31 +++++++++++++++++++++++++++++++ core/src-c/bitfield.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 core/exports/librr/bitfield.h create mode 100644 core/src-c/bitfield.c diff --git a/core/exports/librr/bitfield.h b/core/exports/librr/bitfield.h new file mode 100644 index 0000000..41167f2 --- /dev/null +++ b/core/exports/librr/bitfield.h @@ -0,0 +1,31 @@ + +#ifndef RR_BITFIELD_H +#define RR_BITFIELD_H + +#include + +/// @brief Tests whether a bit of an u64_t at a given index from the least significant bit is set. +/// @param buffer Buffer of which to test the presence of a bit. +/// @param index Index of the bit of which to test the presence. +/// The index starts at 0;0 is the least significant bit. +/// @return Whether the bit in 'buffer' at 'index' was set. +inline bool_t rr_is_bit_set(u64_t buffer, usz_t index); + +/// @brief Sets a bit at a given index from the least significant bit in an u64_t and returns the new u64_t. +/// @param buffer The buffer to set the 'index'th bit of. +/// @param index Index of the bit in the buffer (as counted from the least significant bit) to set a bit of. +/// The index starts with 0; there will always be a bit set (except if the index is greater than 63). +/// @return The modified buffer with the bit set. +inline u64_t rr_set_bit(u64_t buffer, usz_t index); + +/// @brief Returns a bitfield with a given number of bits set to 1, beginning with the least significant bit. +/// @param count Number of bits to set +/// @return The bitfield of which the bits were set. +u64_t rr_bitpad_lsb(usz_t count); + +/// @brief Returns a bitfield with a given number of bits set to 1, beginning with the most significant bit. +/// @param count Number of bits to set +/// @return The bitfield of which the bits were set. +u64_t rr_bitpad_msb(usz_t count); + +#endif // RR_BITFIELD_H diff --git a/core/src-c/bitfield.c b/core/src-c/bitfield.c new file mode 100644 index 0000000..623f601 --- /dev/null +++ b/core/src-c/bitfield.c @@ -0,0 +1,29 @@ +#include + +inline bool_t rr_is_bit_set(u64_t buffer, usz_t index) +{ + return !!(buffer & (1 << index)); +} + +inline u64_t rr_set_bit(u64_t buffer, usz_t index) +{ + return buffer | (1 << index); +} + +u64_t rr_bitpad_lsb(usz_t count) +{ + u64_t result = 0; + for(usz_t index = 0; index < count; ++index) + { + result |= 1 << index; + } +} + +u64_t rr_bitpad_msb(usz_t count) +{ + u64_t result = 0; + for(usz_t index = 0; index < count; ++index) + { + result |= (1 << 63) >> index; + } +}