? Привет!Похоже, вы пытаетесь разложить 4-битные полубайты на 5-битные группы.
В общем, вы можете сделать это следующим образом
uint64_t value = YOUR_DATA; //this has your bits.
for (int i; i< sizeof(value)*2; i++) {
uint8_t nibble = (value & 0xF);
nibble <<= 1; //shift left 1 bit, add 0 to end.
STORE(nibble, i);
value>>=4; //advance to next nibble
}
Это вызовет STORE
один раз длякаждая группа из 4 бит.Аргументами для STORE являются «расширенное» 5-битное значение и счетчик полубайтов, где 0 представляет наименее значимые 4 бита.
Вопрос, на который нужно ответить: как сохранить результат?64 бита / 4 * 5 = 80 бит, поэтому вам нужно либо 2 слова, либо выбросить данные на одном конце.
Если предположить, что 2 слова с привязкой в LSB, STORE может выглядеть как
static uint64_t result[2] = {0,0};
void STORE(uint64_t result[], uint8_t value, int n) {
int idx = (n>12); //which result word?
result[idx] |= value << ( n*5 - idx*64 );
if (n==12) result[1] |= value>>4; //65th bit goes into 2nd result word
}