59 static const uint8_t count_values[34] = {
61 0xC0U, 0xC1U, 0xC2U, 0xC3U, 0xC4U, 0xC5U, 0xC6U, 0xC7U,
62 0xC8U, 0xC9U, 0xCAU, 0xCBU, 0xCCU, 0xCDU, 0xCEU, 0xCFU,
63 0xD0U, 0xD1U, 0xD2U, 0xD3U, 0xD4U, 0xD5U, 0xD6U, 0xD7U,
64 0xD8U, 0xD9U, 0xDAU, 0xDBU, 0xDCU, 0xDDU, 0xDEU, 0xDFU
66 static const uint8_t count_bits[34] = {
68 8U, 8U, 8U, 8U, 8U, 8U, 8U, 8U,
69 8U, 8U, 8U, 8U, 8U, 8U, 8U, 8U,
70 8U, 8U, 8U, 8U, 8U, 8U, 8U, 8U,
71 8U, 8U, 8U, 8U, 8U, 8U, 8U, 8U
75 if ((A == 0U) || (A > 65535U)) {
80 }
else if (A <= 33U) {
83 (uint32_t)count_values[A],
84 (
size_t)count_bits[A]);
101 uint32_t value = A - 2U;
102 int highest_bit = 31 - __builtin_clz(value);
103 int E = (2 * (highest_bit + 1)) - 6;
106 for (
int i = E - 1; (i >= 0) && (result ==
CCSDS124_OK); i--) {
107 uint32_t shifted = value >> (uint32_t)i;
108 uint32_t masked = shifted & 1U;
109 int bit = (int)masked;
138 if ((output != NULL) && (input != NULL)) {
140 static const uint32_t debruijn_lookup[32] = {
141 1U, 2U, 29U, 3U, 30U, 15U, 25U, 4U, 31U, 23U, 21U, 16U,
142 26U, 18U, 5U, 9U, 32U, 28U, 14U, 24U, 22U, 20U, 17U, 8U,
143 27U, 13U, 19U, 7U, 12U, 6U, 11U, 10U
149 int old_bit_position = (int)input->
length;
153 uint32_t word_data = input->
data[word];
156 while ((word_data != 0U) && (result ==
CCSDS124_OK)) {
158 uint32_t lsb = word_data & (uint32_t)(-(int32_t)word_data);
161 uint32_t debruijn_index = (lsb * 0x077CB531U) >> 27U;
162 int bit_position_in_word = (int)debruijn_lookup[debruijn_index];
165 bit_position_in_word = 32 - bit_position_in_word;
168 int new_bit_position = (word * 32) + bit_position_in_word;
171 int delta = old_bit_position - new_bit_position;
177 old_bit_position = new_bit_position;
223 if ((output != NULL) && (data != NULL) && (mask != NULL)) {
228 static const uint32_t debruijn_lookup[32] = {
229 1U, 2U, 29U, 3U, 30U, 15U, 25U, 4U, 31U, 23U, 21U, 16U,
230 26U, 18U, 5U, 9U, 32U, 28U, 14U, 24U, 22U, 20U, 17U, 8U,
231 27U, 13U, 19U, 7U, 12U, 6U, 11U, 10U
240 uint32_t mask_word = mask->
data[word];
241 uint32_t data_word = data->
data[word];
243 while ((mask_word != 0U) && (result ==
CCSDS124_OK)) {
245 uint32_t lsb = mask_word & (uint32_t)(-(int32_t)mask_word);
248 uint32_t debruijn_index = (lsb * 0x077CB531U) >> 27U;
249 int bit_pos_in_word = 32 - (int)debruijn_lookup[debruijn_index];
252 int global_pos = (word * 32) + bit_pos_in_word;
253 if ((
size_t)global_pos < data->
length) {
256 if ((data_word & lsb) != 0U) {
276 if ((output != NULL) && (data != NULL) && (mask != NULL)) {
286 uint32_t mask_word = mask->
data[word];
287 uint32_t data_word = data->
data[word];
289 while ((mask_word != 0U) && (result ==
CCSDS124_OK)) {
291 int clz = __builtin_clz(mask_word);
292 int bit_pos_in_word = clz;
295 size_t global_pos = (word * 32U) + (
size_t)bit_pos_in_word;
297 if (global_pos < data->length) {
299 uint32_t bit_mask = 1U << (31U - (uint32_t)clz);
301 if ((data_word & bit_mask) != 0U) {
308 mask_word &= ~(1U << (31U - (uint32_t)clz));
int ccsds124_bit_extract(bitbuffer_t *output, const bitvector_t *data, const bitvector_t *mask)
Bit extraction (CCSDS Section 5.2.4, Equation 11).