#ifndef SEMQ_CORE_SEMQ_BITS_H
#define SEMQ_CORE_SEMQ_BITS_H
#include <stdint.h>
static inline uint32_t semq_bits_per_symbol_quant(uint32_t n_bins) {
uint32_t alphabet = 2u * n_bins;
uint32_t bits = 0u;
uint32_t v = alphabet - 1u;
while (v > 0u) {
bits++;
v >>= 1u;
}
return bits == 0u ? 1u : bits;
}
static inline uint32_t semq_unpack_bits(const uint8_t* in, uint64_t* bit_pos,
uint32_t bits) {
uint64_t pos = *bit_pos;
uint32_t out = 0u;
for (uint32_t i = 0u; i < bits; i++) {
uint64_t byte_idx = (pos + i) >> 3u;
uint32_t bit_in_byte = (uint32_t)((pos + i) & 7u);
uint32_t bit = (uint32_t)((in[byte_idx] >> bit_in_byte) & 1u);
out |= (bit << i);
}
*bit_pos = pos + bits;
return out;
}
#endif