Added bitfield functions (not tested)

This commit is contained in:
Eric-Paul Ickhorn 2023-12-06 18:15:32 +01:00
parent e1a0519f5e
commit 4823c4f3a4
Signed by: epickh
GPG Key ID: F5EBBE013924D95F
2 changed files with 60 additions and 0 deletions

View File

@ -0,0 +1,31 @@
#ifndef RR_BITFIELD_H
#define RR_BITFIELD_H
#include <librr/types.h>
/// @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

29
core/src-c/bitfield.c Normal file
View File

@ -0,0 +1,29 @@
#include <librr/bitfield.h>
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;
}
}