51 size_t num_bytes = (num_bits + 7U) / 8U;
73 if ((dest != NULL) && (src != NULL)) {
94 if ((result != NULL) && (a != NULL) && (b != NULL)) {
100 for (
size_t i = 0U; i < num_words; i++) {
111 if ((result != NULL) && (a != NULL) && (b != NULL)) {
117 for (
size_t i = 0U; i < num_words; i++) {
128 if ((result != NULL) && (a != NULL) && (b != NULL)) {
134 for (
size_t i = 0U; i < num_words; i++) {
145 if ((result != NULL) && (a != NULL)) {
146 for (
size_t i = 0U; i < a->
num_words; i++) {
147 result->
data[i] = ~a->data[i];
152 size_t num_bytes = (a->
length + 7U) / 8U;
153 size_t bytes_in_last_word = ((num_bytes - 1U) % 4U) + 1U;
154 size_t bits_in_last_byte = a->
length - ((num_bytes - 1U) * 8U);
158 for (
size_t byte = 0U;
byte < bytes_in_last_word;
byte++) {
160 if (
byte == (bytes_in_last_word - 1U)) {
162 byte_mask = (uint8_t)(0xFFU << (8U - bits_in_last_byte));
166 uint32_t shift_amt = (3U - (uint32_t)
byte) * 8U;
167 mask |= ((uint32_t)byte_mask) << shift_amt;
179 if ((result != NULL) && (a != NULL)) {
189 for (
size_t i = 0U; i < (a->
num_words - 1U); i++) {
191 result->
data[i] = (a->
data[i] << 1U) | (a->
data[i + 1U] >> 31U);
201 if ((result != NULL) && (a != NULL)) {
207 for (
size_t i = 0U; i < a->
length; i++) {
227 for (
size_t i = 0U; i < bv->
num_words; i++) {
228 count += (size_t)__builtin_popcount(bv->
data[i]);
232 size_t num_bytes = (bv->
length + 7U) / 8U;
233 size_t extra_bits = (num_bytes * 8U) - bv->
length;
234 if ((extra_bits > 0U) && (bv->
num_words > 0U)) {
237 uint32_t mask = ((1U << (uint32_t)extra_bits) - 1U);
238 uint32_t extra_word = last_word & mask;
239 count -= (size_t)__builtin_popcount(extra_word);
250 if ((a != NULL) && (b != NULL)) {
272 if ((bv != NULL) && (data != NULL)) {
273 size_t expected_bytes = (bv->
length + 7U) / 8U;
274 if (num_bytes > expected_bytes) {
282 uint32_t bytes_to_int = 0U;
283 size_t current_word = 0U;
285 for (
size_t current_byte = 0U; current_byte < num_bytes; current_byte++) {
287 bytes_to_int |= ((uint32_t)data[current_byte]) << ((unsigned)j * 8U);
291 bv->
data[current_word] = bytes_to_int;
300 bv->
data[current_word] = bytes_to_int;
314 if ((bv != NULL) && (data != NULL)) {
315 size_t expected_bytes = (bv->
length + 7U) / 8U;
316 if (num_bytes < expected_bytes) {
320 size_t byte_index = 0U;
321 for (
size_t word_index = 0U; (word_index < bv->
num_words) && (byte_index < num_bytes); word_index++) {
322 uint32_t word = bv->
data[word_index];
325 for (
int j = 3; (j >= 0) && (byte_index < expected_bytes); j--) {
326 data[byte_index] = (uint8_t)((word >> ((
unsigned)j * 8U)) & 0xFFU);
CCSDS 124.0-B-1 Compression Library - Public API.
void bitvector_copy(bitvector_t *dest, const bitvector_t *src)
Copy bit vector contents.
int bitvector_from_bytes(bitvector_t *bv, const uint8_t *data, size_t num_bytes)
Load bit vector from byte array.
int bitvector_to_bytes(const bitvector_t *bv, uint8_t *data, size_t num_bytes)
Store bit vector to byte array.
void bitvector_xor(bitvector_t *result, const bitvector_t *a, const bitvector_t *b)
Bitwise XOR operation.
void bitvector_reverse(bitvector_t *result, const bitvector_t *a)
Reverse bit order.
size_t bitvector_hamming_weight(const bitvector_t *bv)
Count number of set bits (Hamming weight).
static void bitvector_set_bit(bitvector_t *bv, size_t pos, int value)
Set bit value at position (inline for performance).
int bitvector_init(bitvector_t *bv, size_t num_bits)
Initialize a bit vector with specified length.
static int bitvector_get_bit(const bitvector_t *bv, size_t pos)
Get bit value at position (inline for performance).
int bitvector_equals(const bitvector_t *a, const bitvector_t *b)
Compare two bit vectors for equality.
void bitvector_not(bitvector_t *result, const bitvector_t *a)
Bitwise NOT operation.
void bitvector_zero(bitvector_t *bv)
Set all bits to zero.
void bitvector_left_shift(bitvector_t *result, const bitvector_t *a)
Left shift by one bit.
void bitvector_and(bitvector_t *result, const bitvector_t *a, const bitvector_t *b)
Bitwise AND operation.
void bitvector_or(bitvector_t *result, const bitvector_t *a, const bitvector_t *b)
Bitwise OR operation.
#define CCSDS124_MAX_PACKET_LENGTH
#define CCSDS124_ERROR_OVERFLOW
#define CCSDS124_ERROR_INVALID_ARG
#define CCSDS124_ERROR_UNDERFLOW
Fixed-length bit vector structure.
uint32_t data[((CCSDS124_MAX_PACKET_BYTES)+3U)/4U]