Расширение упакованных кусков до 5-битных групп - PullRequest
0 голосов
/ 20 декабря 2018

В настоящее время у меня есть целое число без знака из 64 битов, которое содержит:

0100
0100
0100
0100
0000...

И я бы изменил его на:

01000
01000
01000
01000
00000...

Есть ли способ сделать это?

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

? Привет!Похоже, вы пытаетесь разложить 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
 }
0 голосов
/ 20 декабря 2018

Опустить ведущий 0, это не имеет смысла => сдвиг влево на один бит

...